9

为什么 C# 的设计者不允许这样的事情发生?

public readonly class ImmutableThing
{
    ...
}

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

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

编辑

有人说这不是很重要的功能,但这并不能真正说服我。多核处理器的出现是因为通过频率提高性能遇到了障碍。超级计算机是大量的多处理器机器。并行处理越来越重要,是提高性能的主要途径之一。.NET 中对多线程和并行处理的支持非常重要(各种锁类型、线程池、任务、异步调用、并发集合、阻塞集合、并行 foreach、PLINQ 等),在我看来,一切都可以帮助您编写并行代码更容易提供优势。即使实施起来并不简单。

4

2 回答 2

12

基本上,因为它很复杂——正如 usr 所写,功能在准备好发布之前需要以各种方式进行大量工作。(作为一个扶手椅语言设计师很容易——我敢肯定,要真正做到这一点非常困难,因为这种语言有数百万开发人员拥有无法被更改破坏的关键代码库。)

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

Eric Lippert写了很多关于不变性的文章——这是一个复杂的主题,需要/将需要大量工作才能变成实用的语言特性。改造一个没有它的语言和框架也很困难。我希望 C# 至少可以让编写不可变类型变得更容易,而且我怀疑团队已经花了很长时间思考这个问题——他们是否会对自己的想法感到满意,将其转化为生产语言功能是另一回事。

于 2012-06-01T20:13:52.027 回答
5

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

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

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

于 2012-06-01T20:11:31.437 回答