屬性設計

注意

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

雖然屬性在技術上與方法非常類似,但在使用案例方面卻大不相同。 屬性應該被視為智慧型欄位。 屬性具有欄位的呼叫語法,以及方法的彈性。

✔️ 如果呼叫端不應該變更屬性的值,請建立 get-only 屬性。

請記住,如果屬性型別是可變動的參考型別,即使屬性是 get-only 屬性,也可以變更屬性值。

❌ 請勿提供 set-only 屬性,或 setter 存取範圍比 getter 更廣泛的屬性。

例如,請勿搭配公用 setter 和受保護的 getter 使用屬性。

如果無法提供屬性 getter,請改為實作功能做為方法。 請考慮使用 Set 啟動方法名稱,並遵循您命名屬性的內容。 例如,AppDomain 有一個稱為 SetCachePath 的方法,而不是具有稱為 CachePath 的 set-only 屬性。

✔️ 請為所有屬性提供合理的預設值,以確保預設值不會造成安全性缺口或效率不佳的程式碼。

✔️ 請允許以任何順序設定屬性,即使這會導致物件的暫時無效狀態也一樣。

兩個或多個屬性經常會與某個點相互關聯,在該點其中一個屬性的某些值可能無效,因為在相同物件上提供了其他屬性的值。 在這種情況下,由於無效狀態產生的例外狀況應該延後,直到物件實際使用相互關聯的屬性為止。

✔️ 如果屬性 setter 擲回例外狀況,請保留先前的值。

❌ 避免從屬性 getter 擲回例外狀況。

屬性 getter 應該是簡單的作業,而且不應有任何前置條件。 如果 getter 可以擲回例外狀況,則應該將其重新設計為方法。 請注意,此規則不適用於索引子,我們預期例外狀況是驗證引數的結果。

索引屬性設計

索引屬性是具有參數的特殊屬性,而且可以使用類似陣列索引的特殊語法來呼叫。

索引屬性通常稱為索引子。 索引子應該只在提供邏輯集合中項目存取權的 API 中使用。 例如,字串是字元的集合,且已新增 System.String 上的索引子來存取其字元。

✔️ 請考慮使用索引子來存取儲存在內部陣列中的資料。

✔️ 請考慮針對代表項目集合的類型提供索引子。

❌ 請避免使用具有多個參數的索引屬性。

如果設計需要多個參數,請重新考慮屬性是否真正代表邏輯集合的存取子。 如果沒有,請改用方法。 請考慮使用 GetSet 作為方法名稱的開頭。

❌ 除了 System.Int32System.Int64System.StringSystem.Object 或列舉以外的參數類型,請避免索引子。

如果設計需要其他類型的參數,請強式重新評估 API 是否真的代表邏輯集合的存取子。 如果沒有,請使用方法。 請考慮使用 GetSet 作為方法名稱的開頭。

✔️ 請對索引屬性使用名稱 Item,除非有明顯更好的名稱 (例如,請參閱 System.String 上的 Chars[] 屬性)。

在 C# 中,索引子預設會命名為 Item。 IndexerNameAttribute 可用來自訂此名稱。

❌ 請勿同時提供索引子和語意相等的方法。

❌ 請勿在一種類型中提供多個多載索引子系列。

這會由 C# 編譯器強制執行。

❌ 請勿使用非預設索引屬性。

這會由 C# 編譯器強制執行。

屬性變更通知事件

有時候,提供事件來通知使用者屬性值中的變更會很有用。 例如,System.Windows.Forms.Control 在屬性的值 Text 變更之後引發 TextChanged 事件。

✔️ 當修改高階 API 中的屬性值 (通常為設計工具元件) 時,請考慮引發變更通知事件。

如果使用者知道物件的屬性何時變更,該物件應該引發屬性的變更通知事件。

不過,若針對基底類型或集合等低階 API 引發這類事件,不太可能值得造成的額外負荷。 例如,將新項目新增至清單且 Count 屬性變更時,List<T> 不會引發這類事件。

✔️ 當屬性的值透過外部強制變更時,請考慮引發變更通知事件。

如果屬性值透過某些外部強制變更 (使用物件上呼叫方法以外的方式),則引發事件會向開發人員指出值正在變更且已變更。 良好的範例是文字方塊控制項的 Text 屬性。 當使用者在 TextBox 中輸入文字時,屬性值會自動變更。

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

另請參閱