14

在表面值看来,对象初始值设定程序似乎对.net 4.0“代码契约”提出了一个问题,其中通常应该在对象构造函数完成时建立不变量。然而,可能的是,对象初始化器需要在构建完成后设置属性。对象初始值设定项(.net 4.0)

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

+0

这是为http同样的问题:/ /stackoverflow.com/questions/2656548/ioc-container-handling-state-params-in-non-default-constructor?如果是这样,它就更清晰了,但是如果不是这样,也许你应该强调这一点有什么不同...... – 2010-05-02 07:26:00

回答

9

那么,我想代码合同可能插入一个额外的调用对象初始值设定项的末尾不变 - 如果它可以告诉它正在使用。 (不要忘记,它主要使用IL而不是源代码;据我所知,源代码仅用于生成错误消息。)

尽管这是一个糟糕的设计,由对象初始化器的不幸本质。对于之后的对象初始值设定项,您将如何设置属性?他们可能会使对象再次失效。

这听起来像你基本上希望至少有一些属性是不可改变的,但是你希望得到对象初始化器简单性的好处。命名参数和C#4可选的参数给你一些这一切 - 创造一切适当的属性(和默认值)构造函数,那么你可以这样调用:

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

这是为期不远的对象初始化语法:

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

它的效果并不理想,我希望C#有恒定类型(包括创建和使用)的支持,但它是一个开始......

+0

我同意,对C#中不可变类型的更多支持会很棒。 – Steven 2010-05-02 10:44:00

+0

Hip Hip Hooray用于命名参数和可选参数!自从跳船之后,我错过了VB中少数几个VB特性。 – 2010-05-02 10:58:27

+0

@Jon:实际上“在对象初始值设定项后面设置属性”并不会让我警觉 - 因为客户端负责不打破与每个属性相关的先决条件。我只是想避免这样一种情况,即我实际上不能提供一个不变量,因为对象初始值设定项和代码合约不相处。听起来像陪审团不在目标初始者那里,正如你所说的,“当代码契约*可以在对象初始化器完成时调用一个不变量。”但看起来更可能的是,可选/默认参数在代码合同中会起到很好的作用 – 2010-05-02 16:52:33

相关问题