<分区>
在阅读了很多有关 C# 中的不变性并了解它的好处(无副作用、安全字典键、多线程......)之后,我想到了一个问题:
为什么 C# 中没有关键字来断言类(或结构)是不可变的?此关键字应在编译时检查您无法改变类(或结构)。例如:
public immutable class MyImmutableClass
{
public readonly string field;
public string field2; //This would be a compile time error
public readonly AnyMutableType field3; //This would be a compile time error
public string Prop { get; }
public string Prop2 { get; set; } //This would be a compile time error
public AnyMutableType Prop3 { get; } //This would be a compile time error
}
我认为编译器的工作会很简单,因为它只需要检查几件事情:
- 所有公共(public)字段都是只读的。
- 所有公共(public)属性只有 getter。
- 所有公共(public)字段或属性也具有不可变类型(简单值类型或不可变类/结构)。
- 所有公共(public)函数或公共(public)属性 getter 仅依赖于不可变字段或属性(如前所述的公共(public)字段/属性,或符合相同限制的私有(private)字段/属性)。这当然包括 Equals()、GetHashCode() 和 ToString()。
我想到了这个设计可能存在的一些问题:
- 要让编译器知道编译后的类/结构是不可变的,可能需要对中间语言进行更改。
- 只读泛型集合(例如
IEnumerable<T>
)不变性将取决于类型<T>
的不变性.建议immutable
关键字在此上下文中没有用,因为您无法声明IEnumerable<string>
是不可变的,即使它是。
前面陈述的原因是否足以使该关键字不存在? 我是否遗漏了任何其他缺点? 对于语言的如此大的变化,这是否还不够必要?