C#自动实现的静态属性是否是线程安全的?

我想知道C#是否自动实现了属性,比如public static T Prop { get; set; } public static T Prop { get; set; } ,是否是线程安全的。 谢谢!

看来不是。 这是使用Reflector的反编译:

 private static string Test { [CompilerGenerated] get { return k__BackingField; } [CompilerGenerated] set { k__BackingField = value; } } 

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; } } } 

这就是我们的承诺,这就是你得到的。 汽车性能的关键在于做最基本,简单,便宜的事情; 如果你想做更好的事情那么你应该写一个“真正的”财产。

不可以。您必须将它们包装在螺纹锁定机构中。

 object _lock = new object(); public static Main(string[] args) { lock(_lock) { Prop = new T(); } T val = null; lock(_lock) { val = Prop; } } 

我不相信。 我相信它们只是合成糖:

 private static T _prop; public static T Prop { get { return _prop; } set { _prop = value; } } 

自动属性没有提供同步,包括静态属性。

如果您需要完整的线程安全性,您将需要使用自己的属性和支持字段,并自己处理同步。

为了完整性,类似字段的事件确实内置了线程安全性,但它们本身就是独一无二的。 自动实现的属性没有任何此类function。 但是,您可以执行以下操作:

 public static double SomeProp { // ### NOT RECOMMENDED ### [MethodImpl(MethodImplOptions.Synchronized)] get; [MethodImpl(MethodImplOptions.Synchronized)] set; } 

这个问题是它会锁定Type ,这是一件坏事 。 我个人会为此实现我自己的同步。

不,他们不是线程安全的。 静态属性与静态字段一样容易受到并发问题的影响。