代码合同比对象初始化器(.net 4.0)

时间:2010-05-02 07:10:35

标签: .net .net-4.0 code-contracts design-by-contract object-initializers

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

我的问题是“代码契约”的不变量是否能够处理对象初始值设定项,“好像”在构造函数完成之前设置了属性?那确实非常好!!

1 个答案:

答案 0 :(得分:9)

好吧,我认为Code Contracts 可以在对象初始化程序的末尾插入一个额外的调用 - 如果它可以告诉它正在被使用。 (不要忘记它主要使用IL而不是源代码;据我所知,源代码仅用于生成错误消息。)

这让我觉得糟糕的设计 - 受到对象初始化者的不幸性质的鼓舞。 对象初始值设定项后,如何设置属性?它们可能会使对象再次无效。

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

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

这与对象初始化程序语法相差不远:

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

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