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

Bre*_*ias 14 .net design-by-contract .net-4.0 object-initializers code-contracts

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

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

Jon*_*eet 9

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

这让我觉得设计很糟糕 - 受到对象初始化器的不幸性质的鼓舞.在对象初始化程序之后,您将如何设置属性?它们可能会使对象再次无效.

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

Person person = new Person(firstName: "Jon", lastName: "Skeet");
Run Code Online (Sandbox Code Playgroud)

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

Person person = new Person { FirstName = "Jon", LastName = "Skeet" };
Run Code Online (Sandbox Code Playgroud)

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