readonly struct 是值类型且实例不可变,字段仅能在构造函数或初始化器中赋值;readonly 成员则约束方法/属性不修改状态,二者配合可强化不可变性与性能优化。
readonly struct 是值类型,不能被修改
在 C# 中,readonly struct 表示整个结构体实例是不可变的:编译器会阻止对任何字段(包括 private 字段)的赋值,除非发生在构造函数或字段初始化器中。它不等于“只读字段”,而是整个实例层面的写保护。
常见错误现象:CS8342 “Cannot assign to field ‘xxx‘ because it is a readonly field of a readonly variable” —— 这通常出现在你试图修改 readonly struct 的字段,或者通过 ref readonly 返回后又尝试赋值时。
- 必须用
public readonly或init(C# 9+)声明所有可访问字段;私有字段也得是readonly,否则编译失败 - 构造函数里可以赋值,但之后所有路径(包括属性 setter、方法内部)都不能改字段
- 不能包含
ref返回字段的方法,也不能有可变的get属性(比如返回ref int) - 性能影响小:编译器可能做内联优化,且避免了防御性拷贝(尤其传参时)
public readonly struct Point
{
public readonly int X;
public readonly int Y;
public Point(int x, int y) => (X, Y) = (x, y);
// ❌ 编译错误:无法在 readonly struct 中定义 set 访问器
// public int X { get; set; }
}