Initializer List和Constructor函数调用顺序

时间:2015-01-17 02:09:55

标签: c#

初始化列表与构造函数的调用顺序是什么?

public class MyClass {

    public int MyIntegerValue { set; get; }

    public MyClass() {
        if(MyIntegerValue = 5) {
           DoA();
        } else {
           DoB();
        }
    }
} 

根据以前的代码,如果我致电new MyClass() { MyIntegerValue = 5 }DoA()DoB()会被执行吗?

如果执行DoB(),是否有办法在不将DoA()作为参数传递给构造函数的情况下调用MyIntegerValue

4 个答案:

答案 0 :(得分:3)

var x = new MyClass() { MyIntegerValue = 5 };

的简写
var x = new MyClass();
x.MyIntegerValue = 5;

除了语法糖之外别无选择。

所以答案是首先调用构造函数。

答案 1 :(得分:2)

在这种情况下,它将执行DoB因为将调用第一个构造函数并且将分配它们的MyIntegerValue。

您的代码只是

MyClass mc = new MyClass();
mc.MyIntegerValue = 5;

但是你可以做到

private int _MyIntegerValue = 5;

public int MyIntegerValue
{
    get { return _MyIntegerValue; }
    set { _MyIntegerValue = value; }
}

public MyClass(int _myIntegerValue)
{
    MyIntegerValue = _myIntegerValue;
    if (MyIntegerValue == 5)
        DoA();
    else
        DoB();
}

并像这样打电话

new MyClass(5);

答案 2 :(得分:0)

构造函数将运行1st,因此初始化类时MyIntegerValues将为零。

另外,你有一个错字。它应该是

 if (MyIntegerValue === 5)  // not '=' (assignment) but '==' (equality check)

也许你想要这样的东西:

public class MyClass {

public int MyIntegerValue { get; private set; }

public MyClass(int v) {
    MyIntegerValue = v;
    if(MyIntegerValue == 5) {
       DoA();
    } else {
       DoB();
    }
}
} 

答案 3 :(得分:0)

如果你使用简短的手来初始化你的类,但在场景后面它仍然首先执行你的构造函数然后初始化属性。

因此,当构造函数被执行时,它的属性不会设置为5,因此它将调用DoB。

如果要调用DoA,则必须将属性设置为值5默认值。它必须是这样的。

public class MyClass
    {

        private int _MyIntegerValue = 5;
        public int MyIntegerValue
        {
            get
            {
                return _MyIntegerValue;
            }
            set
            {
                _MyIntegerValue = value;
            }
        }

        public MyClass()
        {
            if (MyIntegerValue == 5)
            {
                DoA();
            }
            else
            {
                DoB();
            }
        }
}