C# · 12月 23, 2021

为什么C#中没有声明性的不变性?

为什么C#的设计师不允许这样的东西? public readonly class ImmutableThing{ …}

安全多线程最重要的方法之一是使用不可变对象/类,但没有办法将类声明为不可变的.我知道我可以通过正确的实现使它变得不可变,但是通过类声明强制执行它将使它变得更加容易和安全.评论一个不可改变的类是最好的“门道”解决方案.

看一个类的声明,你会立即知道这是不可变的.如果你必须修改别人的代码,你会知道一个类不允许意图更改.我只能看到优势,但我不敢相信以前没有人想过这个.那为什么不支持?

编辑

有人说这不是很重要的功能,但这并不能说服我.多核处理器出现,因为频率增加的性能提高.超级计算机是大量的多处理器机器.并行处理越来越重要,也是提高性能的主要方法之一.对.NET中的多线程和并行处理的支持是非常重要的(各种锁类型,线程池,任务,异步调用,并发集合,阻塞收集,并行foreach,PLINQ等),并且在我看来,帮助您编写并行代码更容易给出一个优势.即使实施不是微不足道的.

解决方法 基本上,因为它是复杂的 – 和usr写的,功能需要大量的工作,在各种各样的方式准备发货之前. (很容易成为一名扶手椅语言设计师 – 我确信,使用数百万具有关键代码库的开发人员的语言,真的很难做到这一点,而这些开发人员不能被变更所破坏.)

一个编译器验证一个类型是明显不可变的,而不是在某些情况下过于严格的限制是棘手的.作为一个例子,String在mscorlib中实际上是可变的,但是其他类型的代码(例如StringBuilder)已经被非常仔细地写入,以避免外部世界看到可变性.

Eric Lippert拥有written a lot on immutability – 这是一个复杂的主题,它将/需要大量的工作来转化为实用的语言功能.对于没有开始的语言和框架也是很难改造的.我会喜欢C#,至少可以使写入不可变类型更容易,我怀疑这个团队花费了不少时间思考,无论他们是否乐意将自己的想法变成一种生产语言功能,一个不同的事情