2014-11-03 40 views
1

我有一個類執行以下是該類的代碼。在構造函數中傳遞默認值

public class Executive 
{ 
    public Executive(int ID=0) 
    { 
     //constructor 1 
     this.BaseSalary = 3000; 
     Console.Write("DONE"); 
    } 

    public Executive() 
    { 
     //constructor 2 
     Console.Write("done"); 
    } 
} 

而在主我做到以下幾點:

Executive exec = new Executive() 

它總是調用constructor2。爲什麼不調用Constructor1(ID有默認值)?

+2

這就是方法重載是如何工作的。根據解析規則,無參數構造函數是比需要默認值的構造函數更好的「過載」。 – 2014-11-03 21:27:03

+1

請參閱http://stackoverflow.com/questions/11585000/constructor-overloading-with-default-parameters – Christian 2014-11-03 21:27:17

+1

您會如何在您的場景中調用構造函數#2? – 2014-11-03 21:28:51

回答

3

這就是如何確定最佳方法來完成。未指定的值可選參數從參數列表中刪除當執行重載解析:

7.5.3.2更好功能構件

爲了確定更好功能部件的目的,一個精簡的參數列表A是按照它們出現在原始參數列表中的順序構建的,其中僅包含參數表達式本身。每個候選功能成員的參數列表按以下方式構建:

•如果函數成員僅適用於展開形式,則使用展開形式。

有沒有相應的參數可選參數從參數列表

•參數刪除重新排序,使它們出現在相同的位置參數列表中的相應參數。

此外,在同一段後來:

萬一參數型序列{P1, P2, …, PN}{Q1, Q2, …, QN}是等效(即,每個Pi具有標識轉換成相應的Qi),下面的平局決勝規則被應用,以便確定更好的功能成員。

•如果MP是非通用方法,而MQ是通用方法,則MPMQ更好。

•否則,如果MP適用於其正常形式並且MQ具有params陣列且僅適用於其擴展形式,則MP優於MQ

•否則,如果MP具有比MQ更多的聲明參數,那麼MPMQ更好。如果兩種方法都有params數組並且僅適用於其擴展形式,則會發生這種情況。

否則,如果MP的所有參數都具有相應的參數,而默認參數需要MQ用於取代至少一個可選參數,然後MPMQ更好。

這意味着,如果你有兩個方法都有適用的參數,但一個需要使用可選的參數值,另一個沒有,沒有可選值的一個更好。

2

正如MarcinJuraszek指出的那樣,這就是如何確定應該調用哪個構造函數。當你調用無參數構造函數時,那個被確定爲最合適的。

一個解決問題的方法是隻明確從另一個調用一個構造函數:

public class Executive 
{ 
    public Executive(int ID) 
    { 
     //constructor 1 
     this.BaseSalary = 3000; 
     Console.Write("DONE"); 
    } 

    public Executive():this(0) 
    { 
     //constructor 2 
     Console.Write("done"); 
    } 
}