我想知道 C# 自动实现的属性public static T Prop { get; set; }
是否是线程安全的。谢谢!
问问题
10818 次
7 回答
52
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; } }
}
这就是我们的承诺,这就是你得到的。汽车属性的重点是做最基本、最简单、最便宜的事情;如果你想做一些更漂亮的事情,那么你应该写一个“真实的”属性。
于 2010-01-15T22:18:50.503 回答
16
看来不是。这是使用 Reflector 的反编译:
private static string Test
{
[CompilerGenerated]
get
{
return <Test>k__BackingField;
}
[CompilerGenerated]
set
{
<Test>k__BackingField = value;
}
}
于 2010-01-15T20:50:59.823 回答
6
不可以。您必须将它们包装在线程锁定机制中。
object _lock = new object();
public static Main(string[] args)
{
lock(_lock)
{
Prop = new T();
}
T val = null;
lock(_lock)
{
val = Prop;
}
}
于 2010-01-15T20:50:43.250 回答
5
自动属性(包括静态属性)不提供同步。
如果您需要完整的线程安全,您需要使用自己的属性和支持字段,并自己处理同步。
于 2010-01-15T20:52:52.043 回答
5
为了完整起见,类似字段的事件确实具有内置的线程安全性,但它们是唯一的。自动实现的属性没有任何此类功能。但是,您可以执行以下操作:
public static double SomeProp
{ // ### NOT RECOMMENDED ###
[MethodImpl(MethodImplOptions.Synchronized)] get;
[MethodImpl(MethodImplOptions.Synchronized)] set;
}
这样做的问题是它会锁定Type
,这是一件坏事。我个人会为此实现自己的同步。
于 2010-01-15T21:07:05.490 回答
4
我不相信。我相信它们只是合成糖:
private static T _prop;
public static T Prop
{
get { return _prop; }
set { _prop = value; }
}
于 2010-01-15T20:49:50.157 回答
2
不,它们不是线程安全的。静态属性与静态字段一样容易受到并发问题的影响。
于 2010-01-15T20:49:47.990 回答