首页 文章

保证c#的不变性[关闭]

提问于
浏览
6

在阅读了很多关于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
}

我认为编译器的工作非常简单,因为它需要检查一些事情:

  • 所有公共字段都是只读的 .

  • 所有公共属性只有getter .

  • 所有公共字段或属性也具有不可变类型(简单值类型或不可变类/结构) .

  • 所有公共函数或公共属性getter仅依赖于不可变字段或属性(如前所述的公共字段/ props,或符合相同限制的私有字段/ props) . 这当然包括Equals(),GetHashCode()和ToString() .

这个设计让我想到了一些可能的问题:

  • 为了使编译器知道编译的类/结构是不可变的,可能需要在中间语言中进行更改 .

  • Readonly泛型集合(例如 IEnumerable<T> )的不变性将取决于 <T> 类型的不变性 . 建议的 immutable 关键字在此上下文中没有用,因为您无法声明 IEnumerable<string> 是不可变的,即使它是 .

之前说明的原因是否足以使此关键字不存在?我错过了任何其他缺点吗?对于这种语言的大变化,这是不是必要的吗?

1 回答

  • 4

    简短版本将是:因为没有人提出,规范,设计,实施,测试,记录,翻译和支持该功能 .

    考虑到它可以通过 readonly 字段间接实现,较长的版本将与为什么这样做有关 - 它会增加什么好处 .

    对于课程来说,结果证明是相对较小的 . 请注意,可以使用 [ImmutableObject(true)] 属性,但没有任何功能或框架可以使用它,所以......没有人使用它 .

    有人建议在未来版本的C#中添加"readonly structs"(与 ref 本地人有关, Span<T> 等) - 但是:它死了并且已经消失了 . 但是, ref readonly 的内容仍然存在,这是为了防止在 struct 实例方法中重新分配 this .

相关问题