22

当对象初始化器出现在 C# 中时,我太兴奋了。

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

可以改写更短:

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

对象初始化程序代码更明显,但是当属性数量达到十几个并且一些赋值处理可空值时,很难调试“空引用错误”的位置。Studio 将整个对象初始化程序显示为错误点。

现在我使用对象初始化器来直接分配无错误的属性。

您如何使用对象初始值设定项进行复杂的赋值,或者根本使用十几个赋值是一种不好的做法?

先感谢您!

4

3 回答 3

18

好吧,我对对象初始化器的主要不满是它们需要一个可变类型开始:在可能的情况下,我更喜欢使用不可变类型。话虽如此,当对象初始化器可以工作时(例如,对于 UI 控件),我倾向于使用它们。

如果赋值的值计算起来特别复杂,我可能会三思而后行——特别是,您必须能够在单个表达式中获取值,并且最终可能比通过多个语句计算它的可读性差.. . 但在开始可行的情况下,这种情况相对较少。

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

显然,适度总是一件好事——我不建议把它推向极端……但如果你要设置十几个属性,那么使用对象初始化器对我来说就不会像拥有十几个属性那样重要设置开始。这十几个属性中的任何一个都相关吗?是否应该以某种方式将它们封装在一起?(在某些情况下这很好——同样,尤其是 UI 控件——但通常情况并非如此。)

于 2010-06-18T07:49:30.443 回答
3

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

但是,如果您将分配拆分为多行,我认为 VS 会在引发异常时指向正确的行:

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

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

于 2010-06-18T07:50:22.703 回答
0

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

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

请记住,引入语言的对象初始化器主要是为了使 Linq 语法合法。这并不意味着它应该被更广泛地使用。

话虽如此,如果您要在多个控件上设置一堆属性,那么仅使用缩进就可以更轻松地快速了解某些控件的属性设置位置。

于 2010-06-18T07:49:53.077 回答