分享方式:


建構函式設計

注意

此內容是由 Pearson Education, Inc. 授權轉載自架構設計指導方針:可重複使用 .NET 程式庫的慣例、慣用語和模式,第 2 版。 該版於 2008 年出版,該書自那以後已於第三版進行了全面修訂。 此頁面的某些資訊可能已過期。

建構函式有兩種:型別建構函式和執行個體建構函式。

型別建構函式是靜態的,而且會在使用型別之前由 CLR 執行。 執行個體建構函式會在建立型別的執行個體時執行。

型別建構函式無法接受任何參數。 執行個體建構函式可以接受任何參數。 不接受任何參數的執行個體建構函式通常稱為無參數建構函式。

建構函式是建立型別執行個體的最自然方式。 大部分開發人員都會先搜尋並嘗試使用建構函式,然後再考慮建立執行個體的替代方式 (例如 Factory 方法)。

✔️ 請考慮提供簡單、理想情況下預設的建構函式。

簡單建構函式具有非常少量的參數,而且所有參數都是基本類型或列舉。 這類簡單的建構函式可增加架構的可用性。

✔️ 請考慮如果所需作業的語意未直接對應至新執行個體的建構,或遵循建構函式設計指導方針並不自然時,使用靜態 Factory 方法,而不是建構函式。

✔️ 請勿使用建構函式參數作為設定主要屬性的捷徑。

使用空白建構函式後面接著一些屬性集和使用具有多個引數的建構函式之間,應該沒有任何語意差異。

✔️ 如果建構函式參數是用來直接設定屬性,請對建構函式參數和屬性使用相同的名稱。

這類參數和屬性之間的唯一差異應該是大小寫。

✔️ 在建構函式中執行最少的工作。

除了擷取建構函式參數以外,建構函式不應該執行太多工作。 任何其他處理的成本應該延遲到需要為止。

✔️ 從執行個體建構函式擲回例外狀況 (如果適當)。

✔️ 如果需要這類建構函式,在類別中明確宣告公用無參數建構函式。

如果您未在型別上明確宣告任何建構函式,許多語言 (例如 C#) 會自動新增公用無參數建構函式。 (抽象類別會取得受保護的建構函式。)

將參數化建構函式新增至類別可防止編譯器新增無參數建構函式。 這通常會導致意外的中斷性變更。

❌ 避免在結構上明確定義無參數建構函式。

這可讓陣列建立速度更快,因為如果未定義無參數建構函式,就不需要在陣列中的每個位置上執行。 請注意,基於這個原因,許多編譯器 (包括 C#) 都不允許結構具有無參數建構函式。

❌ 避免在其建構函式內部的物件上呼叫虛擬成員。

呼叫虛擬成員會導致呼叫最會衍生的覆寫,即使大部分衍生型別的建構函式尚未完全執行也一樣。

型別建構函式指導方針

✔️ 讓靜態建構函式成為私人建構函式。

靜態建構函式也稱為類別建構函式,可用來初始化型別。 CLR 會在建立型別的第一個執行個體或呼叫該型別的任何靜態成員之前,呼叫靜態建構函式。 使用者無法控制呼叫靜態建構函式的時間。 如果靜態建構函式不是私用的,則可由 CLR 以外的程式碼呼叫。 視建構函式中執行的作業而定,這會造成非預期的行為。 C# 編譯器會強制讓靜態建構函式成為私人建構函式。

❌ 請勿從靜態建構函式擲回例外狀況。

如果從型別建構函式擲回例外狀況,則型別無法在目前的應用程式定義域中使用。

✔️ 請考慮內嵌初始化靜態欄位,而不是明確使用靜態建構函式,因為執行階段能夠最佳化沒有明確定義靜態建構函式的型別效能。

Portions © 2005, 2009 Microsoft Corporation. 著作權所有,並保留一切權利。

獲 Pearson Education, Inc. 的授權再版,從 Krzysztof Cwalina 和 Brad Abrams 撰寫,並在 2008 年 10 月 22 日由 Addison-Wesley Professional 出版,作為 Microsoft Windows Development Series 一部份的 Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition 節錄。

另請參閱