.Net中的setter是原子的吗?

时间:2012-09-11 09:55:09

标签: .net concurrency

  

可能重复:
  Are reads and writes to properties atomic in C#?

自动生成的setter是否在.NET 4中是原子的?

Public property Busy As boolean

3 个答案:

答案 0 :(得分:2)

他们不能保证。

考虑以上内容编译为带有支持字段的完整表单属性。在setter调用和支持字段的实际分配之间可能会有不同的线程。

此外,并非所有类型都可以原子方式分配 - 大值类型(DateTimeTimeSpan等...)对于原子分配来说太大了。

答案 1 :(得分:1)

没有。 setter是一种具有特殊语法的方法。自动属性是具有自动生成的getter和setter的属性。编译器生成一个基础字段,该字段由getter方法检索并由setter方法分配。

例如,

 public bool Property { get; set; }

实际上编译成如下:

private bool underlyingField;

public bool Property { 
   get { 
      return underlyingField;
   } 
   set { 
      underlyingField = value;
   }
}

字段可以被视为原子单元,写入字段是原子操作。

答案 2 :(得分:1)

是的,如果类型本身的赋值是原子的,则属性赋值是原子的。

setter是一个方法,因此赋值被包装在一个方法调用中(如果它没有内联),但它所做的实际赋值是原子的。