阅读了关于C#中不变性的很多内容,并理解它的好处(无副作用、安全的字典键、多线程...)后,我想到了一个问题:
为什么C#中没有一个关键词来断言一个类(或结构体)是不可变的?这个关键词应该在编译时检查,确保没有任何方式可以修改类(或结构体)。例如:
我认为编译器的工作相当简单,因为它只需要检查以下几个方面:
- 所有公共字段均为只读。 - 所有公共属性仅具有 getter 方法。 - 所有公共字段或属性也具有不可变类型(简单值类型或不可变类/结构)。 - 所有公共函数或公共属性 getter 仅依赖于不可变字段或属性(如前所述的公共字段/属性,或符合相同限制的私有字段/属性)。当然,这包括 Equals()、GetHashCode() 和 ToString()。
这种设计可能存在一些问题:
- 编译器要知道编译类/结构是否不可变,可能需要在中间语言中进行更改。 - 只读泛型集合(例如IEnumerable)的不可变性将取决于类型的不可变性。所提议的immutable关键字在此情况下无用,因为即使IEnumerable是不可变的,您也不能声明它是不可变的。
这些原因足以说明该关键字不存在吗? 我是否忽略了其他缺点? 对于语言的大幅度更改,这是否仅仅不够必要?
为什么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
}
我认为编译器的工作相当简单,因为它只需要检查以下几个方面:
- 所有公共字段均为只读。 - 所有公共属性仅具有 getter 方法。 - 所有公共字段或属性也具有不可变类型(简单值类型或不可变类/结构)。 - 所有公共函数或公共属性 getter 仅依赖于不可变字段或属性(如前所述的公共字段/属性,或符合相同限制的私有字段/属性)。当然,这包括 Equals()、GetHashCode() 和 ToString()。
这种设计可能存在一些问题:
- 编译器要知道编译类/结构是否不可变,可能需要在中间语言中进行更改。 - 只读泛型集合(例如IEnumerable)的不可变性将取决于类型的不可变性。所提议的immutable关键字在此情况下无用,因为即使IEnumerable是不可变的,您也不能声明它是不可变的。
这些原因足以说明该关键字不存在吗? 我是否忽略了其他缺点? 对于语言的大幅度更改,这是否仅仅不够必要?
public singleton class MySingletonClass
或类似public dto class MyDTOClass
的内容。 - Fabjan