这样做有什么区别:
public class MyClass
{
private object _myField = new object();
...
}
并执行以下操作:
public class MyClass
{
private object _myField;
public MyClass()
{
_myField = new object();
}
...
}
答案 0 :(得分:8)
是的,在第一个中,字段在构造函数调用之前初始化。在第二个中,字段在构造函数调用期间初始化。
答案 1 :(得分:6)
只是为了展示casperOne's point ...
using System;
public abstract class BaseClass
{
public BaseClass()
{
Console.WriteLine("Result for {0}: {1}", GetType(),
CalledByConstructor());
}
protected abstract string CalledByConstructor();
}
public class VariableInitializer : BaseClass
{
private string foo = "foo";
protected override string CalledByConstructor()
{
return foo;
}
}
public class ConstructorInitialization : BaseClass
{
private string foo;
public ConstructorInitialization()
{
foo = "foo";
}
protected override string CalledByConstructor()
{
return foo;
}
}
public class Test
{
static void Main()
{
new VariableInitializer();
new ConstructorInitialization();
}
}
这里基类构造函数调用子类中实现的抽象方法 - 这意味着我们可以在构造函数体开始执行之前看到对象的状态。结果如下:
Result for VariableInitializer: foo
Result for ConstructorInitialization:
正如您所看到的,变量初始值设定项已经执行 - 但是在初始化仅在构造函数体中发生的情况下,foo
仍然具有其默认值null。
出于这种原因,从构造函数调用虚拟方法通常是一个非常糟糕的想法。
答案 2 :(得分:0)
要添加到casperOne's answer,这些是初始化readonly
字段的两种可能方法。 Per MSDN:
当字段声明包含a时 readonly修饰符,赋值给 声明引入的字段 只能作为一部分发生 声明或在构造函数中 同一个班级。
相比之下,其他字段(即未标记为readonly
)可以在类中的其他位置分配,例如通过方法调用,但这可能导致需要在使用前检查其状态。