Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#对象初始值设定项复杂性。最佳做法_C#_Object Initializers - Fatal编程技术网

c#对象初始值设定项复杂性。最佳做法

c#对象初始值设定项复杂性。最佳做法,c#,object-initializers,C#,Object Initializers,当对象初始值设定项出现在C#中时,我太激动了 可以重写得更短: MyClass a = new MyClass { Field1 = Value1, Field2 = Value2 } 对象初始值设定项代码更为明显,但当属性数达到12,并且某些赋值处理可为空的值时,很难调试“空引用错误”所在的位置。Studio将整个对象初始值设定项显示为错误点 现在,我使用对象初始值设定项进行直接赋值,仅用于无错误的属性 如何使用对象初始值设定项进行复杂赋值,或者使用十几个赋值项是一种糟糕的做法 提前谢谢你

当对象初始值设定项出现在C#中时,我太激动了

可以重写得更短:

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

现在,我使用对象初始值设定项进行直接赋值,仅用于无错误的属性

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


提前谢谢你

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

如果赋值的值计算起来特别复杂,我可能会三思而后行——特别是,你必须能够在一个表达式中得到值,这可能会比在几个语句中计算它的可读性差。。。但在一开始就可行的情况下,这种情况相对少见

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


显然,适度总是一件好事——我并不是建议你走极端。。。但是,如果要设置十几个属性,那么使用对象初始值设定项对我来说并不像设置十几个属性那样重要。这十几处房产中有没有相关的?这些应该以某种方式封装在一起吗?(在某些情况下,这很好,尤其是对于UI控件,但通常不是。)

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


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

请记住,在语言中引入对象初始值设定项主要是为了使Linq语法合法。这并不意味着它应该得到更广泛的应用


话虽如此,如果要在多个控件上设置一组属性,仅缩进一项就可以更轻松地快速查看某些控件的属性设置位置。

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

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

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

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

不,不:)当出现错误时,我的工作室会突出显示对象初始值设定项的所有行,我不知道我看到什么属性有问题。然后,我想出于调试的目的,这是一种负担,除非你想把鼠标移到分配给字段的每个表达式上,看看哪个表达式是空的。“你不应该为了让代码更容易阅读而干扰经过良好测试和工作的代码”——使用对象初始值设定项是最安全的重构之一。你一般不喜欢重构吗?是的,Jon,在这一点上我非常同意你。在有意义的地方重构。是否可以提高性能,是否可以使代码更安全、更健壮。当然,如您在回答中所提到的,将类型更改为imutable是最佳实践。但是仅仅通过重构来使用对象初始值设定项并不能很好地利用任何人的时间。在没有对象初始值设定项的情况下,您完全可以使用LINQ(即使是匿名类型,因为我认为这就是您的意思),尽管读起来要困难得多。通常我在处理业务对象时都有这样的代码。属性是从UI填充的或来自不同的表。我倾向于不喜欢DAO中的对象初始值设定项,因为您通常从读取器获取字段,并且经常会出现一些错误。你没有任何编译器安全性。在这种情况下,单元测试不能真正保护自己,因为它变成了一个集成测试。数据库中的实体通常有几个字段与之关联。但是,如果赋值很小,我将使用对象初始值设定项。
MyClass a = new MyClass {
                    Field1 = Value1,
                    Field2 = Value2 };