分享方式:


巢狀型別

注意

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

巢狀型別是其他型別 (名為封入型別) 範圍內定義的型別。 巢狀型別可存取其封入型別的所有成員。 例如,巢狀型別可存取封入型別中定義的私人欄位和封入型別所有 Ascendants 中定義的壽保護欄位。

一般而言,巢狀型別應謹慎使用。 這有幾個原因。 有些開發人員可能不完全熟悉概念。 例如,這些開發人員可能會有宣告巢狀型別變數的語法問題。 巢狀型別也會與其封入型別緊密結合,因此不適合作為一般用途型別。

巢狀型別適用於模型化其封入型別的實作詳細資料。 使用者很少必須宣告巢狀型別的變數,而且幾乎無須明確具現化巢狀型別。 例如,集合的列舉程式可為該集合的巢狀型別。 列舉程式通常由其封入型別具象化,而且因為許多語言支援 foreach 陳述式,所以使用者很少必須宣告宣告列舉程式變數。

✔️ 當巢狀型別與其外部型別之間的關聯性為語意所需的這類成員存取範圍,請不要使用巢狀型別。

❌ 請不要使用公用巢狀型別作為邏輯分組建構;對此會使用命名空間。

❌ 避免公開巢狀型別。 唯一的例外狀況是,當巢狀型別的變數僅必須在少數情況下宣告時,例如設為子類別或其他進階自訂案例。

❌ 如果型別可能在包含型別的外部參考,請不到使用巢狀型別。

例如,傳遞至類別上所定義方法的列舉不應定義為類別中的巢狀型別。

❌ 如果巢狀型別必須由用戶端程式碼具現化,請不要使用巢狀型別。 如果型別具有公用建構函式,則可能不應巢狀。

如果可具現化型別,這似乎表示在架構中會有型別獨立存在 (您可建立、使用或終結,而無須使用外部型別),因此不應巢狀。 在與外部型別沒有關聯性的情況下,內部型別不應在外部型別之外廣泛重複使用。

❌ 請不要將巢狀型別定義為介面的成員。 許多語言不支援這類建構。

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 節錄。

另請參閱