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

时间:2010-01-15 20:46:57

标签: c# static thread-safety properties automatic-properties

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

7 个答案:

答案 0 :(得分:50)

C#规范的第10.7.4节规定:

  

将属性指定为   自动实现属性,a   隐藏的支持字段是自动的   可用于酒店,以及   实现访问器以进行读取   并写入该支持字段。该   以下示例:

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

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

答案 1 :(得分:15)

似乎没有。这是使用Reflector的反编译:

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

答案 2 :(得分:6)

没有。您必须将它们包装在线程锁定机制中。

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


    T val = null;
    lock(_lock)
    {
         val = Prop;
    }
}

答案 3 :(得分:4)

我不相信。我相信它们只是语法糖:

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

答案 4 :(得分:4)

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

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

答案 5 :(得分:4)

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

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

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

答案 6 :(得分:2)

不,他们没有线程安全。与静态字段一样易受攻击的静态属性是太并发问题。