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

标签 c# .net multithreading parallel-processing multicore

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

public readonly class ImmutableThing
{
    ...
}

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

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

编辑

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

最佳答案

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

在某些情况下,编译器要验证一个类型是明显不可变的而不是过度限制是很棘手的。例如,String 实际上在 mscorlib 中是可变的,但是其他类型的代码(例如 StringBuilder)已经被非常小心地编写以避免外界从未见过这种可变性。

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

关于c# - 为什么 C# 中没有声明性不变性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10856701/

相关文章:

c# - 具有抗锯齿功能的 XNA 3.1 DrawUserPrimitives - 多重采样不起作用?

.net - 将翻译后的 resx 文件放在 Visual Studio 中的不同文件夹中?

java - Android MultiThread SpeedTest 存在性能问题

c# - 哪些开源 ASP.Net 项目值得学习?

c# - EF4 中的并发性 - 如何有条件地创建实体

C# 运行多个查询的最佳方式

.net - .Net 2.0 的代码契约和防御性编程库?

c# - 在其阻塞版本中使用方法的异步实现

c++ - 非常适合 Xeon-phi 众核架构的应用程序

java : stop safety a thread; not using while and boolean flag