关于C#不可变struct实现及readonly struct文档正确性的疑问
C# readonly struct 章节不存在错误,你混淆了实例不可变性与变量赋值的概念
首先要明确两个核心概念的区别:
- 实例不可变性:指对象/结构体实例的内部状态(字段)无法被修改
- 变量可赋值性:指变量可以被重新赋值为另一个实例(值类型是复制新实例,引用类型是指向新引用)
关于string的不可变性
string作为引用类型,它的不可变性是指一旦创建,实例本身的字符内容无法修改,但变量可以被重新赋值指向新的string实例。比如:
string s = "hello"; s = "world"; // 这里不是修改原"hello"实例,而是变量s指向了新的"world"实例
关于readonly struct的不可变性
readonly struct的设计目标是保证结构体实例的内部状态不可修改,而非禁止变量被赋值。举个例子:
readonly struct Point { public int X { get; } public int Y { get; } public Point(int x, int y) => (X, Y) = (x, y); }
对于这个readonly struct:
- 你无法修改现有实例的字段:
Point p = new Point(1,2); p.X = 3;这行代码会直接编译报错,因为readonly struct的字段是只读的,保证了实例状态不可变 - 但你可以给变量重新赋值:
p = new Point(3,4);这是将一个新的Point实例复制给变量p,并非修改原实例的内容,这完全符合值类型的赋值语义
你提到的x = y;操作,本质是把y的实例值完整复制给x变量,替换了x原来持有的实例,这和readonly struct的不可变性没有冲突——readonly struct禁止的是修改实例内部的状态,而不是禁止变量被重新赋值。
结论
C#语言参考中的readonly struct章节没有错误,你混淆了实例状态的不可修改和变量的可赋值性这两个完全不同的概念。
内容的提问来源于stack exchange,提问作者Leo qiao
相关产品推荐
相关产品推荐

