C#线程中的只读字段是否安全?

C#线程中的只读字段是否安全?

public class Foo { private readonly int _someField; public Foo() { _someField = 0; } public Foo(int someField) { _someField = someField; } public void SomeMethod() { doSomething(_someField); } } 

经历了一些post:
– 在C#中将字段标记为只读有什么好处? – JaredPar认为,曾经构建的只读字段是不可变的,因此是安全的。
– Readonly Fields和Thread Safety ,表明如果构造函数做了很多工作,那么存在一些风险。

因此,如果在上面的代码中使用readonly字段,并且构造函数很轻,那么它是否是线程安全的? 如果someField是ref类型(例如字符串数组)怎么办?

是的 – 您的代码不会在任何构造函数中公开this ,因此在完全构造之前,没有其他代码可以“看到”该对象。 .NET内存模型(从.NET 2开始)在每个构造函数的末尾都包含一个写屏障(IIRC – 搜索Joe Duffy的博客文章以获取更多详细信息),因此不存在另一个线程看到“陈旧”值的风险我知道。

我个人仍然经常使用属性,作为一种将实现与API分离的方法,但从线程安全的角度来看,这很好。

这取决于该领域的内容。

从只读字段或小于字长的任何字段(包括所有引用类型)读取是primefaces操作。

但是,只读字段内的对象可能是也可能不是线程安全的。

不看你的例子,但一般来说它取决于readonly应用的内容,例如,如果字典被声明为readonly你仍然可以更新keyvalue对