2015-01-17 80 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(); 
      } 
     } 
} 
相關問題