Dot-Net

在 .NET 中將成員對象公開為屬性或方法

  • February 26, 2015

在 .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 ();
    }

引用自:https://stackoverflow.com/questions/164527