例如,如果我有这样的课程:
namespace Sample
{
public Class TestObject
{
private Object MyAwesomeObject = new MyAwesomeObject();
}
}
设置它是否有任何好处,以便像这样在构造函数中设置属性?
namespace Sample
{
public Class TestObject
{
private Object MyAwesomeObject;
public TestObject()
{
MyAwesomeObject = new MyAwesomeObject()
}
}
}
答案 0 :(得分:10)
两者(几乎)相同。
在内联时定义初始值设定项:
private Object MyAwesomeObject = new MyAwesomeObject();
这将在类构造函数代码之前发生。这通常更好,但确实有一些限制。
在构造函数中进行设置可让您使用构造函数参数初始化您的成员。通常,这是为了向您的班级成员提供更多信息所必需的。
此外,在构造函数中设置值时,可以在静态上下文中使用类数据,这与内联方法无关。例如,如果要使用表达式树初始化某些内容,则通常需要在构造函数中,因为表达式树位于静态上下文中,不允许在内联成员初始值设定项中访问类成员。 / p>
答案 1 :(得分:4)
这样可以更轻松地进行一步一步的调试
可以更轻松地控制调用构造函数的顺序
它可以根据某些逻辑将参数发送给构造函数,或者将参数传递给您正在处理的对象。
答案 2 :(得分:2)
在声明站点初始化内容的另一个不错的属性是,在readonly字段上执行此操作可确保该字段在其默认(初始化为零)状态下不可观察。
这是我关于这个主题的文章:
答案 3 :(得分:1)
唯一的好处是你可以在构造函数中更加动态,其中内联初始化要求你只对构造函数参数使用静态值等。例如,如果MyAwesomeObject需要配置文件中的值,则必须在构造函数中设置该值
答案 4 :(得分:1)
字段立即初始化 在对象的构造函数之前 实例被调用。如果是构造函数 分配一个字段的值,它会 覆盖字段期间给出的任何值 声明。
答案 5 :(得分:1)
在您的特定示例中,没有任何优势。
然而,存在惰性实例化,在许多情况下会减少内存占用:
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;
}
}
}
}
答案 6 :(得分:1)
我喜欢为类构造函数中的任何类属性(原始对象或对象)保留所有初始化。使代码更易于阅读。更容易调试。此外,构造函数的目的是初始化类属性。
对于针对您的类开发的客户,最好确保所有属性都获得默认值并创建所有对象。当客户端使用您的类时,避免NullReferenceExceptions。对我来说,把这一切都放在构造函数中会使管理变得更容易。
答案 7 :(得分:1)
我不喜欢复制代码,即使它是(希望)少数构造函数之一。为此,我倾向于在任何有意义的地方进行内联初始化。
答案 8 :(得分:0)
通常,需要非默认构造函数可确保实例处于默认状态以外的其他状态。这也允许不可变类,它们各有优势。