25

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

4

7 回答 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 回答