2012-06-01 25 views
9

为什么C#的设计者不允许这样的事情?为什么C#中没有声明不变性?

public readonly class ImmutableThing 
{ 
    ... 
} 

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

一看类声明,你会立即知道它是不可变的。如果你不得不修改别人的代码,你会知道一个班级不允许通过意图进行修改。我只能在这里看到优势,但我不能相信之前没有人想过这个。那么为什么不支持?

编辑

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

+0

因为没有。虽然会很好,但如果他们想要增强语言,似乎会打开窗户。 –

+1

这不就是'struct'吗? (像具有值语义的实体类) – FishBasketGordo

+4

@FishBasketGordo,no。 –

回答

12

基本上,因为它很复杂 - 而且正如usr写道的,功能在它们准备发货之前需要以各种方式进行大量工作。 (这很容易成为一个扶手椅语言设计者 - 我敢肯定,这是令人难以置信的困难真正做到这一点,在数以百万计的开发人员提供了关键的代码库不能被改变被打破的语言。)

这是棘手让编译器在某些情况下验证某种类型是明显不可变的,而不会过分限制。例如,Stringmscorlib内实际上是可变的,但是其他类型的代码(例如StringBuilder)已经非常仔细地编写,以避免外界看到可变性。

Eric Lippert有written a lot on immutability - 这是一个复杂的话题,它将/将需要lot的工作变成一个实用的语言功能。这也很难翻译到和框架,它没有它开始。我很喜欢C#,至少可以让它更容易编写不可变类型,我怀疑团队花了很长一段时间思考它 - 他们是否会用自己的想法将它变成一种生产语言功能是另一回事。

+0

为什么不能不可变的类型仅仅意味着每个字段都必须声明为只读?这似乎并不复杂或困难,不是吗? –

+3

@KirkWoll:只有'StringBuilder'成员的类型不像大多数人希望的那样不可变。基本上,可变性是病毒性的。 –

+0

啊,我明白了。我并不认为它会被强制执行。 –

5

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

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

还有一种东西叫做代表性不变性其中物体内部的状态突变是允许的,但永远不会被外部看到。例如:懒惰计算的字段。根据你的建议,这是不可能的,因为编译器永远不会证明该类对外部是不可改变的,尽管它的字段是常规写入的。

+1

更不用说这个问题比看起来难得多了,而更难的问题往往会被推回到更容易的问题上。 –

+0

@MystereMan:我不会那么说,必然。 C#团队可能采取的很多小而低悬的水果代替了异步 - 这远非“简单”问题。 –

+0

@JonSkeet - 这就是为什么我说“倾向于”。当问题是a)大量产品的营销计划的一部分时b)真的很酷;) –

相关问题