我刚刚学习了对象初始化器,并想知道何时使用它们的最佳实践。
这是我读到的内容:http://msdn.microsoft.com/en-us/library/vstudio/bb384062.aspx 它清楚地表明它们是创建匿名类型所必需的,但我想知道在所有其他情况下我是否应该尝试将它们更喜欢普通的构造函数。
答案 0 :(得分:21)
我想知道在所有其他情况下我是否应该尝试将它们更喜欢普通的构造函数。
我会说不。
构造函数具有很多优点。使用构造函数,编译器将强制将所有必需的数据提供给您的类型。这意味着您无法创建处于无效状态的类型实例,这样可以主动防止许多错误。
另一方面,对象初始化器会产生许多缺点。您必须为初始化所需的任何数据提供可公开设置的属性。在施工时不需要它们,因此您的类型的用户可能会意外遗漏一些数据。
通常,构造函数中需要任何所需的以使您的类正常运行。即使您有自定义构造函数,仍然可以使用对象初始值设定项,但只应用于在类上设置时可选的数据。在初始化中混合两者都很好,这意味着你可以这样做:
var yourInst = new YourClass(req1, req2) { OptionalProperty = opt1 }
这有助于减少所需的构造函数重载次数(类似于使用optional arguments,但没有在可选参数中进行版本控制的一些缺点)。
答案 1 :(得分:10)
我相信你会让事情变得混乱。
对象初始值设定项将调用类的默认(或指定)构造函数!所以你不能真正使用普通构造函数的对象初始化器而不是。因此,在使用对象初始化程序时,无论如何都要调用构造函数。
如果您想知道正在设计的类的对象初始值设定项,那么答案仍然适用。确保提供有意义的必要构造函数。您不需要执行任何特殊操作来启用/允许对象初始值设定项。它们是C#编译器自3.0版以来提供的语法糖,允许您的类的用户在构建后立即初始化您的类的公共成员。
答案 2 :(得分:5)
一个好的经验法则是:
初始值设定项的主要优点是,在创建对象时, 无法设置它们 - 您可以稍后根据其他逻辑设置它们。
答案 3 :(得分:1)
我目前看到使用它们时出现以下问题:
所以我的工作理论是:不要使用对象初始化器,他们鼓励愚蠢的事情。