今天早上我脑子里浮现出一个基本问题.这里是:
这样做有什么区别:
public class MyClass
{
private object _myField = new object();
...
}
Run Code Online (Sandbox Code Playgroud)
并执行以下操作:
public class MyClass
{
private object _myField;
public MyClass()
{
_myField = new object();
}
...
}
Run Code Online (Sandbox Code Playgroud)
只是为了展示casperOne的观点 ......
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();
}
}
Run Code Online (Sandbox Code Playgroud)
这里基类构造函数调用在子类中实现的抽象方法 - 这意味着我们可以在构造函数体开始执行之前查看对象的状态.结果如下:
Result for VariableInitializer: foo
Result for ConstructorInitialization:
Run Code Online (Sandbox Code Playgroud)
如您所见,变量初始化程序已经执行 - 但是在初始化仅发生在构造函数体中的情况下,foo仍然具有其默认值null.
正是出于这种原因,从构造函数中调用虚方法通常是一个非常糟糕的主意.
| 归档时间: |
|
| 查看次数: |
1216 次 |
| 最近记录: |