C#在类构造函数中分配类属性有什么好处吗?

例如,如果我有这样的类:

namespace Sample { public Class TestObject { private Object MyAwesomeObject = new MyAwesomeObject(); } } 

设置它是否有任何好处,以便在这样的构造函数中设置属性?

 namespace Sample { public Class TestObject { private Object MyAwesomeObject; public TestObject() { MyAwesomeObject = new MyAwesomeObject() } } } 

两者(几乎)相同。

在内联定义初始值设定项时:

 private Object MyAwesomeObject = new MyAwesomeObject(); 

这将在类构造函数代码之前发生。 这通常更好,但确实有一些限制。

在构造函数中进行设置允许您使用构造函数参数来初始化您的成员。 通常,这是为了向您的class级成员提供更多信息所必需的。

此外,在构造函数中设置值时,可以在静态上下文中使用类数据,这与内联方法无关。 例如,如果要使用表达式树初始化某些内容,则通常需要在构造函数中,因为表达式树位于静态上下文中,不允许在内联成员初始值设定项中访问类成员。

  1. 它使得逐步调试变得更容易

  2. 它可以更轻松地控制调用构造函数的顺序

  3. 它使得可以根据某些逻辑将参数发送到构造函数,或者将参数传递给您正在处理的对象。

在声明站点初始化东西的另一个好处是,在readonly字段上这样做可以保证字段在默认(初始化为零)状态下是不可观察的。

这是我关于这个主题的文章:

http://blogs.msdn.com/ericlippert/archive/2008/02/18/why-do-initializers-run-in-the-opposite-order-as-constructors-part-two.aspx

唯一的好处是你可以在构造函数中更加动态,其中内联初始化要求你只使用构造函数参数的静态值等。 例如,如果MyAwesomeObject需要配置文件中的值,则必须在构造函数中设置它

在调用对象实例的构造函数之前立即初始化字段。 如果构造函数赋值字段的值,它将覆盖字段声明期间给出的任何值。

请参阅字段(C#编程指南) 。

在您的特定示例中,没有任何优势。

但是,有一些惰性实例化,在许多情况下可以减少内存占用:

 namespace Sample { public Class TestObject { private Object m_MyAwesomeObject; public TestObject() { } public Object MyAwesomeObject { get { if (m_MyAwesomeObject == null) m_MyAwesomeObject = new Object(); return m_MyAwesomeObject; } } } } 

我喜欢保持所有类属性的初始化,无论是类构造函数中的原始属性还是对象。 使代码更易于阅读。 更容易调试。 此外,构造函数的目的是初始化类属性。

对于针对您的类开发的客户,最好确保所有属性都获得默认值并创建所有对象。 当客户端使用您的类时,避免NullReferenceExceptions。 对我来说,将这一切都放在构造函数中会使管理变得更容易。

我不喜欢复制代码,即使它是(希望)少数构造函数之一。 为此,我倾向于在任何有意义的地方使用内联初始化。

通常,需要非默认构造函数可确保实例处于默认状态以外的其他状态。 这也允许不可变类,它们各有优势。