public static T Prop { get; set; }
C#で自動的に実装されたプロパティ(など)がスレッドセーフかどうかを知りたいのですが。ありがとう!
7 に答える
C# 仕様のセクション 10.7.4 には、次のように記載されています。
プロパティが自動的に実装されるプロパティとして指定されている場合、非表示のバッキング フィールドがそのプロパティで自動的に使用可能になり、そのバッキング フィールドを読み書きするアクセサーが実装されます。次の例:
public class Point {
public int X { get; set; } // automatically implemented
public int Y { get; set; } // automatically implemented
}
次の宣言と同等です。
public class Point {
private int x;
private int y;
public int X { get { return x; } set { x = value; } }
public int Y { get { return y; } set { y = value; } }
}
それが私たちが約束することであり、それがあなたが得るものです。自動プロパティのポイントは、最も基本的で単純で安価なことを行うことです。より手の込んだことをしたい場合は、「実際の」プロパティを作成する必要があります。
そうではないようです。これは Reflector を使用した逆コンパイルです。
private static string Test
{
[CompilerGenerated]
get
{
return <Test>k__BackingField;
}
[CompilerGenerated]
set
{
<Test>k__BackingField = value;
}
}
いいえ。スレッドロック メカニズムでそれらをラップする必要があります。
object _lock = new object();
public static Main(string[] args)
{
lock(_lock)
{
Prop = new T();
}
T val = null;
lock(_lock)
{
val = Prop;
}
}
静的プロパティを含む自動プロパティで提供される同期はありません。
完全なスレッド セーフが必要な場合は、独自のプロパティをバッキング フィールドと共に使用し、同期を自分で処理する必要があります。
完全を期すために、フィールドのようなイベントにはスレッドセーフが組み込まれていますが、これはそれらだけです。自動的に実装されるプロパティには、そのような機能はありません。ただし、次のようなことができます。
public static double SomeProp
{ // ### NOT RECOMMENDED ###
[MethodImpl(MethodImplOptions.Synchronized)] get;
[MethodImpl(MethodImplOptions.Synchronized)] set;
}
これに関する問題は、それがロックすることです。Type
これは悪いことです。個人的には、これのために独自の同期を実装します。
私はそうは思いません。私はそれらが単なるシンタックスシュガーであると信じています:
private static T _prop;
public static T Prop
{
get { return _prop; }
set { _prop = value; }
}
いいえ、スレッドセーフではありません。静的プロパティは、静的フィールドと同じように同時実行の問題に対して脆弱です。