Dot-Net
在 .NET 中將成員對象公開為屬性或方法
在 .NET 中,如果一個類包含一個作為類對象的成員,該成員應該作為屬性公開還是與方法一起公開?
如果您所做的只是公開與目前對象的狀態相關的對象實例,則應該使用屬性。
當您有一些邏輯不僅僅是訪問記憶體中的對象並返回該值,或者您正在執行對目前對象的狀態有廣泛影響的操作時,應該使用方法。
您應該為任何概念上表示對象狀態的東西使用屬性,只要它的檢索不是一個足夠昂貴的操作,您應該避免重複使用它。
來自MSDN:
類庫設計者通常必須決定將類成員實現為屬性還是方法。一般來說,方法代表動作,屬性代表數據。使用以下指南可幫助您在這些選項之間進行選擇。
- 當成員是邏輯數據成員時使用屬性。在以下成員聲明中,Name 是一個屬性,因為它是類的邏輯成員。
public string Name get { return name; } set { name = value; }
- 在以下情況下使用方法:
+ 該操作是一種轉換,例如 Object.ToString。 + 該操作非常昂貴,以至於您希望與使用者交流他們應該考慮記憶體結果。 + 使用 get 訪問器獲取屬性值會產生可觀察到的副作用。 + 連續呼叫該成員兩次會產生不同的結果。 + 執行順序很重要。請注意,類型的屬性應該能夠以任何順序設置和檢索。 + 該成員是靜態的,但返回一個可以更改的值。 + 該成員返回一個數組。返回數組的屬性可能非常具有誤導性。通常需要返回內部數組的副本,以便使用者無法更改內部狀態。再加上使用者可以很容易地假設它是索引屬性這一事實,導致程式碼效率低下。在下面的程式碼範例中,每次呼叫 Methods 屬性都會創建一個數組副本。結果,將在以下循環中創建數組的 2n+1 個副本。
Type type = // Get a type. for (int i = 0; i < type.Methods.Length; i++) { if (type.Methods[i].Name.Equals ("text")) { // Perform some operation. } }以下範例說明了屬性和方法的正確使用。
class Connection { // The following three members should be properties // because they can be set in any order. string DNSName {get{};set{};} string UserName {get{};set{};} string Password {get{};set{};} // The following member should be a method // because the order of execution is important. // This method cannot be executed until after the // properties have been set. bool Execute (); }