備註
此內容經Pearson Education, Inc.授權從架構設計指導方針:可重複使用 .NET 程式庫的慣例、習慣用語與範式 (第2版)轉載。 該版於2008年出版,該書自那以後已於 第三版全面修訂。 此頁面的某些資訊可能已過期。
雖然屬性在技術上與方法非常類似,但在使用案例方面卻大不相同。 它們應該被視為智慧型領域。 它們具有欄位的呼叫語法,以及方法的彈性。
✔️ 如果呼叫端不應該變更屬性的值,請建立僅限取得的屬性。
請記住,如果屬性的類型是可變動的參考類型,即使屬性是僅限 get,也可以變更屬性值。
❌ 請勿提供僅限設定的屬性或屬性,而 setter 具有比 getter 更廣泛的存取範圍。
例如,請勿使用具有公用 setter 和受保護 getter 的屬性。
如果無法提供屬性 getter,請將邏輯改為以方法形式實作。 請考慮以 Set
來開始方法名稱,然後跟隨您原本會命名屬性的內容。 例如,AppDomain 有一個稱為 SetCachePath
的方法,而不是具有稱為 CachePath
的僅限集合屬性。
✔️ DO 為所有屬性提供合理的預設值,確保預設值不會造成安全性漏洞或非常沒有效率的程序代碼。
✔️ DO 允許以任何順序設定屬性,即使這會導致對象的暫時無效狀態也一樣。
在同一物件中,通常會有兩個或多個屬性相互關聯,以致某些屬性的值在其他屬性給定的值下變得無效。 在這種情況下,由於無效狀態所產生的例外狀況應該延後,直到對象實際使用相互關聯的屬性為止。
✔️ 如果屬性 setter 擲回例外狀況,請保留先前的值。
❌ 避免從屬性取值方法拋出異常。
屬性 getter 應該是簡單的作業,而且不應該有任何前置條件。 如果 getter 會拋出異常,那麼可能應該重新設計為一個方法。 請注意,此規則不適用於索引器,我們預期在驗證參數後會出現例外。
索引屬性設計
索引屬性是具有參數的特殊屬性,而且可以使用類似於數位件索引的特殊語法來呼叫。
索引屬性通常稱為索引器。 索引器應該只在提供邏輯集合中專案的存取權的 API 中使用。 例如,字串是字元的集合,而 上的 System.String 索引器已加入以存取其字元。
✔️ 請考慮使用索引器來存取儲存在內部陣列中的數據。
✔️ 請考慮在代表項目集合的類型上提供索引器。
❌ 請避免對索引屬性使用多個參數。
如果設計需要多個參數,請重新考慮屬性是否真的代表邏輯集合的存取子。 如果沒有,請改為使用其他方法。 請考慮以Get
或Set
開始方法名稱。
❌避免使用System.Int32、System.Int64、System.String、System.Object或列舉以外的參數類型作為索引器的參數。
如果設計需要其他類型的參數,請強烈重新評估 API 是否真的代表邏輯集合的存取子。 如果沒有,請使用一種方法。 請考慮以Get
或Set
開始方法名稱。
✔️ 請使用名稱 Item
作為索引屬性,除非有明顯更好的名稱(例如,請參閱 Chars[] 上的 System.String
屬性)。
在 C# 中,索引器預設會命名為 Item。 IndexerNameAttribute可用來自訂此名稱。
❌ DO NOT 同時提供語意相等的索引器和方法。
❌ 請勿在一種類型中提供一個以上的多載索引器系列。
這是由 C# 編譯程式強制執行。
❌ 請勿使用非預設索引屬性。
這是由 C# 編譯程式強制執行。
屬性變更通知事件
有時候,提供事件通知用戶屬性值的變更會很有用。 例如,System.Windows.Forms.Control
在屬性TextChanged
的值變更之後,引發 Text
事件。
✔️ 當高階 API 中的屬性值(通常是設計工具元件)修改時,請考慮引發變更通知事件。
如果有適合的情境讓使用者知道物件屬性何時改變,則該物件應該觸發屬性的變更通知事件。
不過,對於基底類型或集合等低階 API,提出這類事件不太可能值得額外的負擔。 例如,當新的專案新增至清單和List<T>屬性變更時,Count
不會引發這類事件。
當屬性值因外部因素變更時,請考慮引發變更通知事件。
如果屬性值因某些外部因素而改變(而不是透過呼叫物件的方法來改變),引發的事件會通知開發人員該值正在改變並且已經改變。 一個很好的範例是 Text
文本框控件的 屬性。 當使用者在 中 TextBox
輸入文字時,屬性值會自動變更。
© 2005年、2009年Microsoft公司部分。 保留所有權利。
經 Pearson Education, Inc. 許可重新刊登自 Krzysztof Cwalina 和 Brad Abrams 所著的 架構設計指導方針: 可重複使用的 .NET 程式庫慣例、慣用語和模式,第 2 版,2008 年 10 月 22 日由 Addison-Wesley Professional 發行,作為 Microsoft Windows 開發系列的一部分。