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

时间:2010-07-28 13:40:21

标签: c#

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

这样做有什么区别:

public class MyClass
{
    private object _myField = new object();

    ...
}

并执行以下操作:

public class MyClass
{
    private object _myField;

    public MyClass()
    {
        _myField = new object();
    }

    ...
}

3 个答案:

答案 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)可以在类中的其他位置分配,例如通过方法调用,但这可能导致需要在使用前检查其状态。