2015-01-17 53 views
1

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

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

MyIntegerValue属于MyClass吗?如果是这样,你可以添加到你的代码片段? – adv12

+1

此外,您可以使用快速命令行应用程序测试自己,这可能比您编写问题的速度快。 – adv12

+0

@ adv12不过,这是一个有趣的问题,人们可以从中学习。我没有得到人们渴望降低的想法。如果你不喜欢这个问题,请不要回答。 –

回答

2

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

你的代码只是

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

但是你可以做

private int _MyIntegerValue = 5; 

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

OR

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

,并呼吁像这样

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

var x = new MyClass(); 
x.MyIntegerValue = 5; 

速记没什么好,但语法糖。

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

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(); 
    } 
} 
} 
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(); 
      } 
     } 
} 
相关问题