2011-09-18 100 views
3

假設我有2個構造函數。我可以從另一個構造函數調用構造函數嗎(作爲常規方法)?

public class MyClass 
{ 
    public MyClass() 
    { 
    int id = 0; 
    //Same behaviour 
    } 
    Public MyClass(int id) 
    { 
    //Same behaviour 
    } 
} 

兩個結構都實現相同的行爲。唯一的區別是,如果第一個構造函數被調用並且id = 0的值;

我的問題是知道我是否可以調用第二個構造函數,而不是實現相同的行爲?如果可能的話,我能做到嗎?

回答

2

是的,這被稱爲構造函數鏈。它的實現,像這樣:

public class MyClass { 
    public MyClass() : this(0) { } 
    public MyClass(int id) { 
     this.id = id; 
    } 
} 

請注意,您可以鏈接到基類的構造函數,像這樣:

public class MyClass : MyBaseClass { 
    public MyClass() : this(0) { } 
    public MyClass(int id) : base(id) { } 
} 

public class MyBaseClass { 
    public MyBaseClass(int id) { 
     this.id = id; 
    } 
} 

如果有一個基類,你不指定一個構造函數鏈,如果有的話,默認是可訪問的無參數構造函數。如果你沒有指定一個鏈接到的構造函數,並且沒有可訪問的無參數構造函數,那麼你將得到一個編譯時錯誤。

5

你可以這樣做:

public class MyClass { 
    public MyClass() : this(0) { 
    } 
    public MyClass(int id) { 
    } 
} 

這裏的Microsoft's documentation就可以了。 (你必須向下滾動;嘗試搜索: this

3
public class MyClass 
{ 
    public MyClass() : this(0) 
    { 
    } 
    public MyClass(int id) 
    { 
    //Same behaviour 
    } 
} 
0

爲什麼不把這個相同的行爲放在一個私有函數中?

+6

爲什麼不鏈構造? –

1

如果這是C#4,另一種是使用默認值的構造函數的參數(這實際上使得可選):

public MyClass(int id = 0) { ... 

我覺得這是你的榜樣的理想解決方案。

但是這取決於你是否願意使用這個類作爲一個構造函數約束的類型參數類型參數...

+0

真的很好。謝謝。 – Richard77

相關問題