分享方式:


結構設計

注意

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

一般用途實值型別最常稱為結構 (C# 關鍵字)。 本節提供一般結構設計的指導方針。

❌ 請不要提供結構的無參數建構函式。

遵循此指導方針可允許建立結構陣列,而無須在每個陣列項目上執行建構函式。 請注意,C# 不允許結構具有無參數建構函式。

❌ 請不要定義可變動的實值型別。

可變動的實值型別有數個問題。 例如,當屬性 getter 傳回實值型別時,呼叫者會收到複本。 由於複本是隱含建立,開發人員可能未注意到而變動複本,而不是變動原始值。 此外,某些語言 (特別是動態語言) 使用可變動實值型別時也會發生問題,原因是即使區域變數已取值,仍會導致建立複本。

✔️ 請確定當所有執行個體資料都設定為零、False 或 Null (視需要) 時,狀態為有效的。

這可防止在建立結構陣列時不會意外建立無效的執行個體。

✔️ 請在實值型別上實作 IEquatable<T>

實值型別上的 Object.Equals 方法會導致 boxing,而且其預設實作並非有效率,原因是其使用反映。 Equals 可有更加的效能並可實作,因此不會導致 boxing。

❌ 請不要明確擴充 ValueType。 事實上,大部分的語言都會防止此情況。

一般而言,結構可非常實用,但應僅用於小型、單一且可變動的值且不會經常 Boxed。

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

另請參閱