代码之家  ›  专栏  ›  技术社区  ›  Brent Arias

代码协定与对象初始值设定项(.NET 4.0)

  •  14
  • Brent Arias  · 技术社区  · 15 年前

    从表面上看,对象初始值设定项似乎为.NET 4.0“代码契约”带来了问题,在这种情况下,通常应在对象构造函数完成时建立不变量。不过,假设对象初始值设定项要求在构造完成后设置属性。

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

    1 回复  |  直到 15 年前
        1
  •  9
  •   Jon Skeet    15 年前

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

    不过,我觉得这是一个糟糕的设计,因为对象初始值设定项的不幸性质。关于设置属性,您会怎么做? 之后 对象初始值设定项?它们可能会使对象再次无效。

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

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

    这离对象初始值设定项语法不远:

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

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