天天看點

C#基礎知識系列五(構造函數)

前言

  本節主要來學習下執行個體構造函數、私有構造函數和靜态構造函數。

  構造函數的作用:

  1、當一個類在new執行個體化對象時,可調用構造函數進行初始化對象。

  2、不帶參數的構造函數稱為“預設構造函數”。 無論何時,隻要使用 new 運算符執行個體化對象,并且不為 new 提供任何參數,就會調用預設構造函數。除非類是static的,否則 C# 編譯  器将為無構造函數的類提供一個公共的預設構造函數,以便該類可以執行個體化。

  3、通過将構造函數設定為私有構造函數可以阻止類被執行個體化。

  4、結構類型的構造函數與類的構造函數類似,但是 structs 不能包含顯式預設構造函數,因為編譯器将自動提供一個構造函數。此構造函數會将struct中的每個字段初始化為預設值。   隻有當 struct 用 new 執行個體化時,才會調用此預設構造函數。

執行個體構造函數

使用 new 表達式建立某個類的對象時,會使用執行個體構造函數建立和初始化所有執行個體成員變量。 要初始化靜态類或非靜态類中的靜态變量,必須定義靜态構造函數。

隻要建立基于 CoOrds 類的對象,就會調用此執行個體構造函數。 諸如此類不帶參數的構造函數稱為“預設構造函數”。 然而,提供其他構造函數通常十分有用。 例如,可以向 CoOrds 類添加構造函數,以便可以為資料成員指定初始值:

這樣便可以用預設或特定的初始值建立 CoOrd 對象,如下所示:

如果某個類沒有構造函數,則會自動生成一個預設構造函數,并使用預設值來初始化對象字段。

也可以用執行個體構造函數來調用基類的執行個體構造函數。 類構造函數可通過初始值設定項來調用基類的構造函數,如下所示:

在此示例中,Circle 類将表示半徑和高度的值傳遞給 Shape(Circle 從它派生而來)提供的構造函數。

私有構造函數

 私有構造函數是一種特殊的執行個體構造函數。 它通常用在隻包含靜态成員的類中。 如果類具有一個或多個私有構造函數而沒有公共構造函數,則其他類(除嵌套類外)無法建立該類的執行個體。 例如:

聲明空構造函數可阻止自動生成預設構造函數。 注意,如果您不對構造函數使用通路修飾符,則在預設情況下它仍為私有構造函數。 但是,通常顯式地使用 private 修飾符來清楚地表明該類不能被執行個體化。

當沒有執行個體字段或執行個體方法(如 Math 類)時或者當調用方法以獲得類的執行個體時,私有構造函數可用于阻止建立類的執行個體。 如果類中的所有方法都是靜态的,可考慮使整個類成為靜态的。

下面是使用私有構造函數的類的示例:

注意,如果您取消注釋該示例中的以下語句,它将生成一個錯誤,因為該構造函數受其保護級别的限制而不可通路:

靜态構造函數

 靜态構造函數用于初始化任何 靜态 資料,或用于執行僅需執行一次的特定操作。 在建立第一個執行個體或引用任何靜态成員之前,将自動調用靜态構造函數。

靜态構造函數具有以下特點:

靜态構造函數既沒有通路修飾符,也沒有參數。

無法直接調用靜态構造函數。

在程式中,使用者無法控制何時執行靜态構造函數。

靜态構造函數的典型用途是:當類使用日志檔案時,将使用這種構造函數向日志檔案中寫入項。

靜态構造函數在為非托管代碼建立包裝類時也很有用,此時該構造函數可以調用 LoadLibrary 方法。

如果靜态構造函數引發異常,運作時将不會再次調用該構造函數,并且在程式運作所在的應用程式域的生存期内,類型将保持未初始化。

繼續閱讀