C# 構造器總結
在C#中,構造器分為實例構造器和類型構造器,
一、實例構造器
構造引用類型的對象時,在調用實例 構造器之前,為對象分配的內存總是歸0,沒有被構造器顯示重寫的字段都保證獲得0或null的值
在一個類中,如果我們沒有顯示的定義任何構造器,那麽C#編譯器將定義一個默認的無參構造器,這個無參構造器會簡單的調用一個基類的無參構造器,如下面SomeType類
public class SomeType { public SomeType() : base() { } }
但是當我們基類中沒有提供無參構造器怎麽辦呢,那麽這時我們的派生類就必需顯示的調用一個基類的構造器,否則編譯器會報錯。如果類的修飾符為static,編譯器根本不會在類的定義中生成默認構造器。
在一個類型中我們是可以定義多個實例構造器的,但是每個構造器必須有不同的簽名。
接下來我們再來談談實例構造器的執行,請看如下代碼:
internal sealed class SomeType { private int m_x = 5; }
當我們構造SomeType類時,它的m_x字段被初始化為5,這是因為SomeType的構造器把5存儲到字段m_x,再調用基類的構造器,最後調用了自己的構造器。如果你還不懂,請看下面這段代碼:
internal sealed class SomeType {private int m_x = 5; private double m_d = 3.1415;
private byte m_b; public SomeType(string s) { m_d = 10; } }
當我們實例化類型時調用了SomeType(string s)這個構造器時,編譯器生成的代碼首先會初始化m_x、m_b和m_d的值,再調用基類的構造器,這裏的基類就是object,最後再執自己的代碼,所以最後三個字段的值為m_x = 5,m_d =10,m_b
說完了引用類型的實例構造器,我們再來談談值類型的構造器,個人認為值類型的構造器沒有這麽重要,只要記得幾點就行:
1、CLR確實允許為值類型定義構造器,可以調用構造器來初始化值類型的字段,但必須顯示調用才會執行。
2、C#編譯器不允許值類型定義無參構造器,但是CLR允許,也就是說,我們可以使用另一種語言定義帶有無參構造器的值類型。
二、類型構造器
除了實例構造器,CLR還支持類型構造器,也叫靜態構造器、類構造器或者類型初始化器。
1、類型構造器默認沒有定義,如果要定義,只能定義一個
2、類型構造器永遠沒有參數
3、必須標記為static,這也是它與實例構造器的區別
4、C#自動將其標為私有,用顯示標記,否則會報錯,之所以私有,是為了防止開發人員調用它,因為它的調用是CLR負責的。
5、類型構造器中的代碼只能訪問類型的靜態字段,並且它的常規用途就是初始化這些字段。
C# 構造器總結