我应该使用对象初始值设定项还是构造函数?

我刚刚学习了对象初始化器,并想知道什么时候使用它们的最佳实践。

这是我读到的关于它们的内容: http : //msdn.microsoft.com/en-us/library/vstudio/bb384062.aspx它清楚地表明它们是创建匿名类型所必需的,但我想知道我是否应该在所有其他情况下,尝试将它们更喜欢普通的构造函数。

我想知道在所有其他情况下我是否应该尝试将它们更喜欢普通的构造函数。

我会说不。

构造函数具有很多优点。 使用构造函数,编译器将强制将所有必需的数据提供给您的类型。 这意味着您无法创建处于无效状态的类型实例,这样您就可以主动防止许多错误。

另一方面,对象初始化器产生许多缺点。 您必须为初始化所需的任何数据提供可公开设置的属性。 它们在施工时不是必需的,因此您的类型的用户可能会意外遗漏一些数据。

通常,在构造函数中应该需要您的类所需的任何操作。 即使您有自定义构造函数,仍然可以使用对象初始值设定项,但只应将其用于在类上设置时可选的数据。 在初始化中混合两者都很好,这意味着你可以这样做:

var yourInst = new YourClass(req1, req2) { OptionalProperty = opt1 } 

这有助于减少所需的构造函数重载次数(类似于使用可选参数 ,但没有可选参数中版本控制的一些缺点)。

我相信你很困惑。

对象初始值设定项调用类的默认(或指定)构造函数! 所以你不能真正使用对象初始化器而不是普通的构造函数。 因此,在使用对象初始化程序时,无论如何都要调用构造函数。

如果您想知道正在设计的类的Object Initializers,那么答案仍然适用。 确保提供有意义的必要构造函数。 您无需执行任何特殊操作即可启用/允许对象初始值设定项。 它们是C#编译器自3.0版以来提供的语法糖,允许您的类的用户在构建后立即初始化您的类的公共成员。

一个好的经验法则是:

  • 如果需要使类正常工作,那么它应该是构造函数参数
  • 如果更改它会破坏类,它应该是构造函数参数
  • 如果它是可选的,具有合理的默认值,和/或简单而安全地更改类的行为方式,它应该是初始化器。

初始化程序的主要优点是您不必在创建对象时设置它们 – 您可以稍后根据其他逻辑设置它们。

我目前看到使用它们的以下问题:

  1. 分配的属性必须是可更改的。 这似乎是不可取的,因为如果将数据传递给构造函数,我可以在那里检查它,如果提供的数据不足或错误,则使对象创建失败。 如果可以使用属性分配数据,我突然必须弄清楚我的对象的状态是什么,是否所有内容都已正确创建或者我可能处于其他状态。
  2. 分配的属性必须是公共的。 这意味着必须暴露对可能是私有的东西的访问,然后通过使用接口或类似的东西来限制。

所以我的工作理论是:不要使用对象初始化器,他们鼓励愚蠢的事情。