C#中的易失性字段

Che*_*hen 11 .net c# clr language-features volatile

从规范10.5.3挥发性字段:


volatile字段的类型必须是以下之一:

  • 引用类型.

  • 类型byte,sbyte,short,ushort,int,uint,char,float,bool,System.IntPtr或System.UIntPtr.

  • 具有枚举基类型byte,sbyte,short,ushort,int或uint的枚举类型.


首先,我想确认我的理解是正确的:我猜上面的类型可以是volatile,因为它们在内存中存储为4字节单元(因为它的地址对于引用类型),这保证了读/写操作是原子的.double/long/etc类型不能是volatile,因为它们不是原子读/写,因为它们在内存中超过4个字节.我的理解是否正确?

第二,如果第一个猜测是正确的,为什么用户定义的结构只有一个int字段(或类似的东西,4个字节就可以)不能是易失性的?理论上它是原子的吗?或者仅仅是因为所有用户定义的结构(可能超过4个字节)不允许设计的易失性?

Ill*_*ack 1

所以,我想你建议补充以下几点:

  • 一种仅由一个字段组成的值类型,可以合法地将其标记为易失性。

首先,字段通常是私有的,因此在外部代码中,任何内容都不应该依赖于某个字段的存在。尽管编译器访问私有字段没有问题,但基于程序员没有适当方法影响或检查的某些功能来限制某些功能并不是一个好主意。

由于字段通常是类型内部实现的一部分,因此可以在引用的程序集中随时更改它,但这可能会使使用该类型的一段 C# 代码变得非法。

这个理论和实践原因意味着唯一可行的方法是volatile为值类型引入一个修饰符,以确保上面指定的点成立。然而,由于唯一能从此修饰符中受益的类型是具有单个字段的值类型,因此此功能可能在列表中不是很靠前。