2009-10-30 139 views
3

在下面的代碼:什麼是C#代碼做:

public class A 
{ 
public A():this(null){} 
public A(string b){/*code here*/} 
} 

有什麼用第一個構造函數的?

回答

26

第一構造函數被傳遞到null參數b的第二構造函數。

因此,如果你調用new A()這將是與調用new A(null)

+0

+1好的答案 - 正如我所說的,Construcotr過載:-) – rohancragg 2009-10-30 07:38:00

+6

正確的術語是」構造函數鏈「 – 2009-10-30 07:47:51

+6

準確地說,定義多個構造函數是構造函數重載,並讓這些構造函數互相調用是構造函數chaining。調用另一個構造函數的代碼,例如'this()'或'base(foo)',被稱爲構造函數初始值設定項。 – Joren 2009-10-30 08:53:04

5

當你有一個構造函數參數

public A(string b){ /* code here */ } 

public A():this("") { } //default 

默認的構造函數實際調用「參數的構造」與「」爲一個參數。你正在傳遞一個參數。這樣做是爲了避免編寫相同的代碼兩次

1

這是一個默認的構造函數,第二個用b == NULL調用來完成。

+0

幕後發生的操作(例如data-綁定和序列化)將調用默認的構造函數,所以有時可以明確定義你想要在默認構造函數(即無參數)中發生的事情 – rohancragg 2009-10-30 07:40:22

3

這是一個constructor overload

我同意這似乎並沒有在這種情況下非常有用,因爲最有可能的字符串未初始化值爲null反正。

Constructors in C#

+0

可能有一些其他代碼要求A具有默認構造函數,但是我想你:this(null)不是必需的。 – Thomas 2009-10-30 07:42:35

3

看到這個,當你超載構造發生。

在你的榜樣空構造器public A():this(null){}尋找那些可以在空的對象值的構造函數。因爲一個字符串是一個可以佔位的對象,所以它會調用該構造函數。

這個例子看起來很簡單。

一個更有意義的例子(但仍保持其基本):

public class AddNumbers 
{ 
    public AddNumbers():this(100, 100) 
    {  } 

    public AddNumbers(int x, int y) 
    {  
     int sum = x + y; 
     Console.WriteLine(sum.ToString()); 
    }  
} 
在這個例子中

,當調用程序調用空構造函數,它將輸出200,因爲它被調用的addNumbers方法與X = 100,Y = 100

我知道這是一個簡單的例子,但我希望這是更清晰。

0

一些接口或設計人員要求那裏有一個「無參數」的構造函數。

這個方法在那些時候派上用場。

0

有在使用對象初始化參數的默認構造函數是必需的:

Employee e = new Employee() {FirstName="John", LastName="Smith"}; 

在這種情況下,我可能不會使用構造函數鏈,雖然。構造函數重載爲您提供了一種使用參數進行初始化的替代方法。構造函數鏈實際上有用的地方在於使構造函數參數可選; C#不支持可選參數(還)。

「最佳實踐」將視情況而定,用途,建築,要求等(ISO諮詢規則一:「這要看情況。「)