14

从表面上看,对象初始化器似乎给 .net 4.0“代码契约”带来了问题,其中通常应该在对象构造函数完成时建立不变量。然而,据推测,对象初始化器需要在构造完成后设置属性。

我的问题是“代码契约”的不变量是否能够处理对象初始化器,“好像”属性是在构造函数完成之前设置的?那真是太好了!

4

1 回答 1

9

好吧,我想代码契约可以在对象初始化器的末尾插入一个对不变量的额外调用——如果它可以告诉它正在使用的话。(不要忘记它主要使用 IL 而不是源代码;据我所知,源代码仅用于生成错误消息。)

不过,这让我觉得设计很糟糕——对象初始化器的不幸性质鼓励了我。在对象初始化器之后设置属性你会怎么做?他们可以使对象再次无效。

听起来您基本上希望至少某些属性是不可变的,但是您希望从对象初始化程序的简单性中受益。C# 4 中的命名参数和可选参数为您提供了一些这样的功能 - 创建一个具有所有适当属性(和默认值)的构造函数,然后您可以像这样调用它:

Person person = new Person(firstName: "Jon", lastName: "Skeet");

这与对象初始值设定项语法相差不远:

Person person = new Person { FirstName = "Jon", LastName = "Skeet" };

这并不理想,我希望 C# 对不可变类型(创建和使用)有更多支持,但这是一个开始......

于 2010-05-02T07:23:17.003 回答