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级成员提供更多信息所必需的。
此外,在构造函数中设置值时,可以在静态上下文中使用类数据,这与内联方法无关。 例如,如果要使用表达式树初始化某些内容,则通常需要在构造函数中,因为表达式树位于静态上下文中,不允许在内联成员初始值设定项中访问类成员。
-
它使得逐步调试变得更容易
-
它可以更轻松地控制调用构造函数的顺序
-
它使得可以根据某些逻辑将参数发送到构造函数,或者将参数传递给您正在处理的对象。
在声明站点初始化东西的另一个好处是,在readonly字段上这样做可以保证字段在默认(初始化为零)状态下是不可观察的。
这是我关于这个主题的文章:
唯一的好处是你可以在构造函数中更加动态,其中内联初始化要求你只使用构造函数参数的静态值等。 例如,如果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。 对我来说,将这一切都放在构造函数中会使管理变得更容易。
我不喜欢复制代码,即使它是(希望)少数构造函数之一。 为此,我倾向于在任何有意义的地方使用内联初始化。
通常,需要非默认构造函数可确保实例处于默认状态以外的其他状态。 这也允许不可变类,它们各有优势。