Mac*_*iej 9 .net c# parallel-processing multithreading multicore
为什么C#的设计者不允许这样的东西?
public readonly class ImmutableThing
{
...
}
Run Code Online (Sandbox Code Playgroud)
安全多线程最重要的方法之一是使用不可变对象/类,但是没有办法将类声明为不可变.我知道我可以通过正确的实现使其变得不可变但是通过类声明强制执行将使它更容易和更安全.将一个类评为不可变是最好的"门支柱"解决方案.
看一下类声明,你会立即知道它是不可变的.如果您必须修改其他人的代码,您就会知道某个类不允许按意图进行更改.我只能在这里看到优势,但我不敢相信没有人想过这个.那么为什么不支持?
编辑
有人说这不是一个非常重要的功能,但这并不能说服我.多核处理器出现了,因为频率提高了性能.超级计算机是多处理器的重要机器.并行处理越来越重要,是提高性能的主要方法之一..NET中对多线程和并行处理的支持很重要(各种锁类型,线程池,任务,异步调用,并发集合,阻塞集合,并行foreach,PLINQ等),在我看来,所有可以帮助你编写并行的东西代码更容易给出优势.即使实施起来也不重要.
Jon*_*eet 12
基本上,因为它很复杂 - 正如我们所写的那样,功能在准备发布之前需要以各种方式进行大量工作.(它很容易成为一个扶手椅语言设计师 - 我确信它真的很难实现它,这种语言有数百万开发人员具有关键代码库,这些代码库无法通过更改来解决.)
编译器在某些情况下验证类型是否明显不可变而不过度限制是很棘手的.作为一个例子,String实际上是可变的mscorlib,但是其他类型的代码(例如StringBuilder)已经非常仔细地编写,以避免外部世界看到这种可变性.
Eric Lippert 撰写了很多关于不变性的文章 - 这是一个复杂的主题,需要大量的工作才能变成实用的语言功能.对于一个没有开始的语言和框架进行改造也很困难.我喜欢C#,至少可以更容易地编写不可变类型,我怀疑团队已经花了很长时间来思考它 - 他们是否会因为他们的想法将其转化为生产语言功能而感到高兴另一件事.
需要设计,实施,测试,记录,部署和支持功能.这就是为什么我们首先获得最重要的功能,而不是最重要的功能是迟到或永远不会.
你的建议没问题,但有一个简单的解决方法(如你所说).因此,它不是一个"紧急"的功能.
还有一种称为代表不变性的东西,其中允许对象内部的状态突变但是从不对外部可见.示例:延迟计算的字段.根据您的提议,这是不可能的,因为编译器永远不会证明该类对外部是不可变的,尽管它的字段是常规写入的.