代码之家  ›  专栏  ›  技术社区  ›  Andrew Florko

对象初始值设定项的复杂性。最佳实践

  •  22
  • Andrew Florko  · 技术社区  · 14 年前

    当对象初始值设定项出现在C中时,我太兴奋了。

    MyClass a = new MyClass();
    a.Field1 = Value1;
    a.Field2 = Value2;
    

    可以缩短:

    MyClass a = new MyClass { Field1 = Value1, Field2 = Value2 }
    

    对象初始值设定项代码更明显,但当属性数达到12,并且某些赋值处理可为空的值时,很难调试“空引用错误”所在的位置。Studio将整个对象初始值设定项显示为错误点。

    现在,我使用对象初始值设定项进行简单的分配,只用于无错误的属性。

    如何使用对象初始值设定项进行复杂的赋值,或者使用十几个赋值是一个糟糕的实践?

    提前谢谢!

    3 回复  |  直到 14 年前
        1
  •  18
  •   Jon Skeet    14 年前

    好吧,我对对象初始值设定项的主要看法是,它们需要一个可变类型来开始:在可能的情况下,我更喜欢使用不可变类型。已经说过了,当一个对象初始值设定项 我倾向于使用它们。

    如果作业的值计算起来特别复杂,我可能会三思而后行——特别是,您必须能够在一个 表达 最后,可能会比通过几个 声明 …但在这种情况下,这是相对罕见的,在这种情况下,这是可行的。

    我不能说我在使用对象初始值设定项的属性分配过程中遇到了任何异常问题——这对我来说并不是什么问题。如果是这样的话,我可能会尝试编写一个失败的单元测试,在没有调试程序的情况下,代码通常很容易修复。

    显然,适度总是一件好事-我不是建议把这一切推向极端…但是,如果您要设置一打属性,使用对象初始值设定项对我来说就没有设置一打属性那么重要了。这十几处房产中有没有相关的?这些应该以某种方式封装在一起吗?(在某些情况下, 很好——同样,特别是对于UI控件——但通常不是这样。)

        2
  •  3
  •   ErikHeemskerk    14 年前

    如果您正在调试应用程序,那么在大多数情况下,您应该仍然能够使用VS的调试工具来确定哪个分配导致了空引用。

    但是,如果您将分配拆分为多行,我认为当抛出异常时,vs将指向正确的行:

    MyClass a = new MyClass {
                        Field1 = Value1,
                        Field2 = Value2 };
    

    注意:我自己不这么做,所以对我(可能)可怕的断线风格要温和一些。

        3
  •  0
  •   Daniel Dyson    14 年前

    我从不在开发中的代码中使用它,因为正如您指出的,调试更困难。

    对于经过良好测试的代码,它可以使代码更具可读性,尽管有人可能会认为,您不应该为了更容易阅读而与经过良好测试和工作的代码混淆。

    记住,对象初始化器主要用于语言,使LINQ语法合法。这并不意味着它应该被更广泛地使用。

    尽管如此,如果要在多个控件上设置一系列属性,仅缩进就可以使您更容易快速了解某些控件的属性设置位置。