初始化列表与构造函数的调用顺序是什么?
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
?
答案 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();
}
}
}