2012-03-26 37 views
5

所有的代碼示例總是使用鹼()如下顯式調用派生構造函數中的base()是否可選?

class A 
{ 
    public A() 
    { 
     Console.Writeline("A"); 
    } 
} 

class B : A 
{ 
    public B():base() {} 
} 

例如http://msdn.microsoft.com/en-us/library/hfw7t1ce%28v=vs.71%29.aspx

,而我最近發現

class A 
{ 
    public A() 
    { 
     Console.Writeline("A"); 
    } 
} 

class B : A 
{ 
    public B() {} 
} 

還打印出

Q - 是否是一個新的「功能」或者是壞的形式,不要在派生類的構造函數調用基()和意志增加我的不良業力並在以後造成問題?

可以安全地調用base()嗎?

+2

提供的鏈接適用於Visual Studio 2003(因此不是新的),幷包含有關何時調用基礎構造函數的說明。這裏的任何答案都只是重複MSDN中的信息。 – cadrell0 2012-03-26 15:22:14

+0

@ cadrell0該鏈接有一個從derived.Constructor()調用base()的示例,它不回答上述AFAIK上的Q – Kumar 2012-03-26 16:47:22

回答

7

不,這不是新的 - 如果你沒有明確地調用基礎構造函數,默認的構造函數將被默認調用。

自己添加這個我認爲只是「噪音」,編譯器會爲你做,所以你不必這樣做。如果你需要一個特定的重載而不是默認的構造函數(這意味着如果基類沒有提供默認的構造函數,你確實需要有一個基礎的構造函數調用),那麼你應該只調用一個基類構造函數。

+2

要詳細說明「默認構造函數將被調用」的含義,請參見http:// )注意:調用'new B(「b2」)''調用'B :: B(String)',然後調用'A :: A()'構造函數。)然而'C :: C(String)由於引用了'base(arg)'引用,因此調用'A :: A(String)'構造函數。 – 2012-03-26 15:29:22

6

你只需要當

1)你必須傳遞變量到基構造函數使用基地。

2)您需要指定要使用的基礎構造函數。

除此之外,你可以放心地把它離開。默認的基礎構造函數將被調用。

3

無論您是否使用: base()明確調用它,默認構造函數都會被調用。這是一個風格問題,但是普遍的慣例是,除非你調用一個特定的,參數化的基礎構造函數,否則它會被忽略。

+0

+1說得好。 (其他答案也很好) – radbyx 2012-03-26 15:25:43

1

調用基座()不是必需的。默認的基礎構造函數會自動調用,除非您明確調用另一個。這是我個人喜好的問題,有點像在訪問實例字段之前預先計劃this

0

當父對象和子對象都具有隱式或顯式無參數構造函數時,不需要從構造函數中調用base()。這會在默認情況下發生,不,這不是新的。通常,您將使用base()方法來說明您正在調用哪個父構造函數,並將參數從子構造函數傳遞給父元素。

用你的構造函數中的參數試試看它是如何工作的。