2015-09-07 67 views
0

我想了解一些編程考試的代碼,我偶然發現了這個表示法,我似乎找不到解釋。 我搜索了stackoverflow,msdn和幾個在線教程,但沒有運氣。C#對象初始化程序

的代碼是這樣的:

class A 
{ 
    public A(): this("b") 
    { 
     Console.WriteLine("c"); 
    } 

    public A(string i) 
    { 
     Console.WriteLine(i); 
    } 
} 

class B : A 
{ 
    public B() 
    { 
     Console.WriteLine("a"); 
    } 
    --------------- 
    static void Main(string[] args) 
    { 
     A b = new A(); 
    } 
} 

此,按說,打印出「BC」,但我甚至無法理解的繼承和所有。我無法找出什麼是這個符號在這裏做:

public A(): this("b") 
{ 
    Console.WriteLine("c"); 
} 

我發現的唯一的事情,看上去類似遠程的對象初始化,但只能在一個在線教程。爲他們檢查了MSDN - 沒有類似的代碼。任何人都可以幫忙?提前致謝!

+2

您是否閱讀過有關構造函數語法的規範部分? –

+4

[它被稱爲''構造器鏈接''。](http://stackoverflow.com/questions/1814953/c-sharp-constructor-chaining-how-to-do-it) –

+0

什麼'符號'特別是混淆給你? ':this(「b」)'將調用A類參數化構造函數,並簡單地打印「b」,然後調用A無參數構造函數 - 打印「c」。 – Marcus

回答

2

這與對象初始值設定無關。其約爲constructor-chaining。當任何方法(包括構造函數)都有這樣一個this(...)你所說的是第一次調用與類似signatur的過載時,所以在你的情況下this("b")將首先調用這個ctor:public A(string i)。完成這個調用之後,在該特定構造函數中的實際工作將在您的excample Console.WriteLine("c");中完成。

+0

如果我正確地理解了這一點,調用的順序將是:超類構造函數,鏈式超級構造函數,子類構造函數。但是如果我在子類中有匹配的構造函數,但超類中沒有匹配構造函數呢?在給定的例子中,如果我有公共B(「M」){}並在Main()中調用它? – dzenesiz

+0

你必須提供任何類型的構造器鏈接,無論是隱含的還是明確的。在你的情況下,因爲你已經有了一個具有匹配簽名的基類構造函數('public A(string)'),那麼在你的類'B'的ctor之前調用它。如果類'A'沒有這樣一個編譯器,將會產生編譯錯誤。這種鏈接確保每個派生的對象都被完全初始化,包括所有的基礎成員。 – HimBromBeere