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

时间:2012-06-01 20:08:33

标签: c# .net multithreading parallel-processing multicore

为什么C#的设计者不允许这样的东西?

public readonly class ImmutableThing
{
    ...
}

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

看一下类声明,你会立即知道它是不可变的。如果您必须修改其他人的代码,您就会知道某个类不允许按意图进行更改。我只能在这里看到优势,但我不敢相信没有人想过这个。那么为什么不支持呢?

修改

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

2 个答案:

答案 0 :(得分:12)

基本上,因为它很复杂 - 正如我们所写的那样,功能在准备出货之前需要以各种方式进行大量工作。 (很容易成为一个扶手椅语言设计师 - 我确信真正这样做是非常困难的,这种语言有数百万开发人员具有关键代码库,这些代码库无法通过更改来解决。)< / p>

编译器在某些情况下验证类型是否明显不可变而不过度限制是很棘手的。例如,String实际上在mscorlib内是可变的,但是其他类型的代码(例如StringBuilder)已经非常谨慎地编写,以避免外部世界看到这种可变性。

Eric Lippert有written a lot on immutability - 这是一个复杂的话题,需要很多的工作才能变成实用的语言功能。对于没有开始的语言和框架进行改造也很困难。我喜欢C#,至少让更容易来编写不可变类型,我怀疑团队已经花了很长时间思考它 - 他们是否会因为他们的想法变得足够快乐它成为一种生产语言功能是另一回事。

答案 1 :(得分:5)

需要设计,实施,测试,记录,部署和支持功能。这就是为什么我们首先获得最重要的功能,而不是最重要的功能是迟到或永远不会。

你的建议没问题,但有一个简单的解决方法(如你所说)。因此,它不是一个“紧急”的特征。

还有一种称为表示不变性的东西,其中允许对象内部的状态突变,但永远不会对外部可见。示例:延迟计算的字段。这在你的提议下是不可能的,因为编译器永远不会证明该类对外部是不可变的,尽管它的字段是常规写入的。