c# - 保证 C# 中的不变性

标签 c# immutability

<分区>

在阅读了很多有关 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>是不可变的,即使它是。

前面陈述的原因是否足以使该关键字不存在? 我是否遗漏了任何其他缺点? 对于语言的如此大的变化,这是否还不够必要?

最佳答案

简短的版本是:因为没有人提出、规范、设计、实现、测试、记录、翻译和支持该功能。

更长的版本将涉及到为什么要这样做,因为它可以通过 readonly 间接实现。领域 - 它会增加什么好处

对于类(class)来说,结果是相对次要的。请注意,有一个 [ImmutableObject(true)] 可以使用的属性,但没有任何功能或框架真正使用它,所以......没有人使用它。

有人提议在 C# 的 future 版本中添加“只读结构”(与 ref 局部变量、Span<T> 等相关)- 但是:它死了,消失了。然而,ref readonly stuff 继续存在,旨在防止重新分配 thisstruct实例方法。

关于c# - 保证 C# 中的不变性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44966084/

相关文章:

c# - 每个 CPU 线程的实际限制是多少?

c# - 缓存 ASP.NET AJAX 服务 javascript 代理

c# - 如何找到相机视野所包含的区域?

c# - 在 .NET 控制台应用程序中,是否可以让一行文本始终在控制台中保持可见?

javascript - 使用 ngrx 或 ngxs 时,我们会自动获得对象不变性吗?

rust - 不能借用 `*x` 作为可变的,因为它也被借用为不可变的

javascript - Immutable.js 比较是如何工作的?

c# - 如何以编程方式在默认 PDF 阅读器中打开 PDF?

javascript - 这个 redux reducer 可以吗

java - 为什么我不应该使用不可变 POJO 而不是 JavaBean?