c#对象初始化程序的复杂性。最佳实践

时间:2010-06-18 07:43:49

标签: c# object-initializers

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

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

可以改写得更短:

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

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

现在我使用对象初始化程序只为无错误的属性进行简单的分配。

如何使用对象初始化程序进行复杂的分配,或者使用十几个分配是不好的做法?

提前谢谢!

3 个答案:

答案 0 :(得分:18)

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

如果分配的值计算特别复杂,我可能会三思而后行 - 特别是,您必须能够在单个表达式中获取值,这可能最终成为在几个语句中计算它的可读性较差 ......但在开始时可行的情况下这种情况相对较少。

我不能说我在使用对象初始化程序进行属性赋值时遇到异常问题 - 这不是我想出的问题。如果确实如此,我可能会尝试编写一个失败的单元测试,无论如何,代码通常很容易修复而不需要调试器。

显然,审核始终是一件好事 - 我并不是建议将其置于极端......但如果你设置了十几个属性,那么使用对象初始化程序对我来说就不会像我一样关心十几个要设置的属性。这些十几个属性中的任何一个都相关吗?那些应该以某种方式封装在一起吗? (在某些情况下 很好 - 再次,尤其是UI控件 - 但通常情况并非如此。)

答案 1 :(得分:3)

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

但是,如果你将赋值分成多行,我认为VS会在抛出异常时指向右边的行:

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

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

答案 2 :(得分:0)

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

对于经过充分测试的代码,它可以使代码更具可读性,尽管可以说你不应该使用经过良好测试和工作的代码来使它更容易阅读。

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

话虽如此,如果你在一些控件上设置一堆属性,只有缩进可以让你更容易快速了解某些控件的属性设置。