构造函数与直接赋值的赋值

Fra*_*ank 4 c#

今天早上我脑子里浮现出一个基本问题.这里是:

这样做有什么区别:

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)

cas*_*One 8

是的,在第一个中,字段在构造函数调用之前初始化.在第二个中,构造函数调用期间初始化该字段.


Jon*_*eet 6

只是为了展示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.

正是出于这种原因,从构造函数中调用虚方法通常是一个非常糟糕的主意.