2013-01-25 216 views
-1

由於我剛剛接觸到構造函數主題,因此我對使用它的原因有一些疑惑。聲明一個構造函數和不聲明它有什麼不同?C#構造函數聲明

+1

http://en.wikipedia.org/wiki/Constructor_%28object-oriented_programming%29 –

+2

[構造函數(C#編程指南)](http://msdn.microsoft.com/zh-cn/library/vstudio/ ace5hbzh.aspx) – phoog

回答

3

構造函數用於初始化類對象。如果你不聲明/定義它,那麼將爲你創建一個默認的構造函數。

2

如果你沒有聲明任何構造函數,編譯器將生成沒有參數的默認構造函數。

考慮這個類:

public Class X 
{ 
    public int A { get; set; } 
} 

在有沒有構造函數聲明,所以編譯器會把默認的構造函數在類是這樣的:

public Class X 
{ 
    public int A { get; set; } 

    public X() 
    { 
    } 

} 

如果你在類中聲明構造函數中,將不會生成默認構造函數。

public Class X 
{ 
    public int A { get; set; } 

    public X (int a) 
    { 
      // do something 
    } 

} 

在此示例中,將不會生成默認的空構造函數。 如果您嘗試創建這樣一個實例:

X obj = new X(); 

它會生成編譯錯誤。

更多細節:Default constructorsConstructor in C#

2

有聲明一個公共的無參數的構造函數只是調用基類的公共的無參數的構造函數之間沒有區別:

public class Test 
{ 
    public Test() : base() {} 
} 

等同於:

public class Test 
{ 
} 

編譯器提供了一個默認construc爲你的

(和base()部分是隱含的。如果你不明確鏈到另一個構造函數,編譯器將其當作如果你試圖鏈的參數的基類構造函數)

但這並不意味着構造函數是無用的......你通常會把代碼放在那裏。通常它複製參數:

public class Test 
{ 
    private readonly string name; 

    public Test(string name) 
    { 
     this.name = name; 
    } 
} 

...但構造函數大多可以包含與普通方法相同的代碼。值得注意的是,當你的構造函數運行時,雖然對象可能不是完全初始化,因爲派生類的構造函數體尚未執行。出於這個原因,建議不要在構造函數中調用虛擬方法。

有關實例構造函數的詳細信息,請參見C#5規範的第10.11節;關於默認構造函數的詳細信息,請參見第10.11.4節。


更具體而言,它將鏈,如果你寫base()。如果沒有無參數的構造函數,但有的構造函數,其參數都是可選的,將被調用。

1

構造函數被用於許多事情的類。

  1. 如果您想對類的實例進行初始化。

    public class MyClass 
    { 
        private string myWork = string.Empty; 
        public MyClass() 
        { 
         myWork = "Started"; 
        } 
        } 
    
  2. 如果你想limitize範圍對象創建

    public class MyClass 
    { 
        private string myWork = string.Empty; 
        protected MyClass() 
        { 
         myWork = "Started"; 
        } 
    } 
    

還有許多其他的東西像基類的支持和其他人。請在MSDN上搜索。