繁体   English   中英

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

[英]Are C# auto-implemented static properties thread-safe?

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM