从对话中,我相信 C# 团队明白,他们使编写可变类型变得更容易,同时没有为不可变类型提供类似的好处。并不是说随着时间的推移它们使不可变性变得更加困难——它们只是没有让它变得更容易……除了匿名类型,它们是不可变的,但还有其他各种缺点。我当然不希望自动属性被带走——在合适的地方,它们真的很有用。我只想拥有只读属性的等效项(允许仅在构造函数中设置它们)。
我发现 C# 4 的命名参数和可选参数使得构造不可变类型实例变得更加容易——您仍然可以获得对象初始化器的许多好处,而没有可变性的缺点。只需为类型中真正可选的方面提供默认值,将其余部分保留为强制构造函数参数,调用者可以做他们想做的事——使用命名参数来增加清晰度。
不幸的是,集合初始化器更难破解。我希望看到可以与不可变集合一起使用的“链接”初始化程序,这样编译器就可以创建链接在一起的调用,而不是重复调用Add
同一个实例:Plus
ImmutableList<string> x = new ImmutableList<string> { "a", "b", "c" };
会去:
ImmutableList<string> x = new ImmutableList<string>().Plus("a")
.Plus("b")
.Plus"(c");
当然,在框架中拥有更多不可变集合会很好:)
当然,这对自动道具方面没有帮助。我不得不承认我最近一直在作弊,使用私人二传手伪造不变性:
public string Name { get; private set; }
不过,它确实让我觉得很脏,当这是我的真正意图时,它并没有让它真正不可变。
基本上,我是说我能感受到你的痛苦——我很确定 C# 团队能感受到。但请记住,他们的资源有限,设计一种语言非常困难。
您可能会发现NDC 2010 的视频很有趣 - 与 Eric Lippert、Mads Torgersen、Neal Gafter(和我)进行了精彩的小组讨论,我对 C# 5 的建议在另一个视频中。