C# 字段修饰符
🏷️ C#
CLR 术语 | C# 术语 | 说明 |
---|---|---|
Static | static | 这种字段是类型状态的一部分,而不是对象状态的一部分 |
Instance | (默认) | 这种字段与类型的一个实例关联,而不是与类型本身关联 |
InitOnly | readonly | 这种字段只能由一个构造器方法中的代码写入 |
Volatile | volatile | 编译器、CLR 和硬件不会对访问这种字段的代码执行“线程不安全”的优化措施。只有以下类型才能标记为 volatile :所有引用类型,Single ,Boolean ,Byte ,SByte ,Int16 ,UInt16 ,Int32 ,UInt32 ,Char ,以及基础类型为 Byte ,SByte ,Int16 ,UInt16 ,Int32 或 UInt32 的所有枚举类型。 |
下面是一段各种字段类型的实例代码:
csharp
class SomeType
{
// 这是一个静态 readonly 字段,在运行时对这个类进行初始化时,它的值会被计算并存储到内存中
public static readonly Random s_random = new Random();
// 这是一个静态 read/write 字段
private static Int32 s_numberOfWrites = 0;
// 这是一个实例 readonly 字段
public readonly String Pathname = "Untitled";
// 这是一个实例 read/write 字段
private System.IO.FileStream m_fs;
public SomeType(string pathname)
{
this.Pathname = pathname;
}
private string DoSomething()
{
// 读写静态字段
s_numberOfWrites = s_numberOfWrites + 1;
// 读取 readonly 字段
return Pathname;
}
}
重要提示:当某个字段是引用类型,并且该字段被标记为 readonly
时,不可改变的是引用,而非字段的引用对象。
以下代码对此进行了演示:
csharp
public sealed class AType
{
public static readonly Char InvalidChars = new Char { 'A', 'B', 'C' };
}
public sealed class AnotherType
{
public static void M()
{
// 下面三行代码是合法的,可通过编译,并可成功
// 修改 InvalidChars 数组中的字符
AType.InvalidChars[0] = 'X';
AType.InvalidChars[1] = 'Y';
AType.InvalidChars[2] = 'Z';
// 下一行代码是非法的,无法通过编译,
// 因为不能让 InvalidChars 引用别的什么东西
AType.InvalidChars = new Char { 'X', 'Y', 'Z' };
}
}