Share via


屬性概觀

更新:2007 年 11 月

元件應該定義屬性,而非公用欄位,因為 Visual Studio 這類視覺化設計工具 (Visual Designer) 在屬性瀏覽器中顯示的是屬性,而不是欄位 (其他一些應該定義屬性的理由已列於本主題結尾)。

屬性就像是智慧型欄位。屬性通常擁有隨伴存取子函式的私用資料成員,並且在語法上是當做類別的欄位來存取 (雖然屬性可以擁有不同的存取層級,不過這裡討論的只專注於較常見的公用存取情況)。由於屬性早已使用於好幾版的 Visual Basic 中,所以 Visual Basic 程式設計人員可以略過這個主題。

屬性定義通常是由下列兩個部分組成:

  • 私用資料成員的定義。

    private int number = 0;
    
    Private number As Integer = 0
    
  • 使用屬性宣告語法的公用屬性定義。這個語法會透過 getset 存取子函式將私用資料成員與公用屬性關聯。

    public int MyNumber 
    {
    // Retrieves the number data member.
    get 
       { 
          return number; 
       }
    // Assigns to the number data member.
    set 
       { 
          number = value;
       }
    }
    
    Public Property MyNumber As Integer
       ' Retrieves number.
       Get 
          Return number
       End Get
       ' Assigns to number.
       Set 
          number = value
       End Set
    End Property
    

value 這個詞在屬性定義語法中是個關鍵字。在呼叫的程式碼中,變數 value 會被指派給屬性。value 的型別必須與它被指派到的屬性的宣告型別相同。

雖然屬性定義通常會包括私用資料成員,不過並非必須如此。get 存取子不用存取私用資料成員就可以傳回值。其 get 方法可傳回系統時間的屬性,就像這樣的例子。屬性可以讓資料隱藏,存取子方法會隱藏屬性的實作。

在不同的程式語言中,屬性語法會有些差異。例如,property 這個詞彙在 C# 中並不是關鍵字,但是在 Visual Basic 中則是關鍵字。如需語言相關的資訊,請參考該語言的文件。

下列範例會定義類別 SimpleProperty 中名為 MyNumber 的屬性,並從 UsesSimpleProperty 類別中存取 MyNumber。

public class SimpleProperty 
{
   private int number = 0;
   public int MyNumber 
   {
   // Retrieves the data member number.
   get 
      { 
         return number; 
      }
   // Assigns to the data member number.
   set 
      { 
         number = value;
      }
   } 
// Other members.
}
public class UsesSimpleProperty
{
   public static void Main()
   {
      SimpleProperty example = new SimpleProperty();
// Sets the property.
      example.MyNumber = 5;
// Gets the property.
      int anumber = example.MyNumber;
   }
}
Public Class SimpleProperty 
    Private number As Integer = 0

    Public Property MyNumber As Integer
        ' Retrieves number.
        Get 
            Return number
        End Get
        ' Assigns to number.
        Set 
            number = value
        End Set
    End Property    

' Other members...
End Class

Public Class UsesSimpleProperty
    Public Shared Sub Main()
        Dim example As New SimpleProperty()
        ' Sets the property.
        example.MyNumber = 5
        ' Gets the property.
        Dim anumber As Integer = example.MyNumber
    End Sub
End Class

getset 方法通常和其他方法並無不同。它們可以執行任何程式邏輯、擲回例外狀況、被覆寫,而且可以使用程式語言所允許的任何修飾詞宣告。不過,也請注意,屬性也可以是靜態的。如果屬性是靜態的,對於 getset 方法能做執行的內容會有一些限制。如需詳細資訊,請參閱您的程式語言手冊。

屬性的型別可以是基本型別、基本型別的集合、使用者定義型別或使用者定義型別的集合。對於所有基本型別,.NET Framework 提供實作字串至數值轉換的型別轉換子 (Type Converter)。如需詳細資訊,請參閱一般性型別轉換。如果屬性有型別轉換子,它就可以顯示在設計工具的屬性瀏覽器中。如果您要定義自訂屬性並且希望屬性瀏覽器能顯示它們,那麼您必須實作自訂型別轉換子。

當屬性的資料型別是列舉型別時,Microsoft Visual Studio 這類的開發環境會在 [屬性] 視窗中將屬性顯示為下拉式清單。如果屬性的資料型別是具有屬性的類別,那麼這些屬性就被稱為定義屬性的子屬性。在 Visual Studio 的 [屬性] 視窗中,使用者可以展開屬性以顯示出其子屬性。

在設計階段必須將屬性 (Attribute) 加入到屬性 (Property),以便讓它們能適當地顯示在屬性瀏覽器中。如需詳細資訊,請參閱元件的設計階段屬性

您應該從元件公開 (Expose) 屬性來取代公用欄位,因為屬性能夠訂定版本,它們允許資料隱藏,而且存取子方法可以執行其他邏輯。一般而言,由於 Just-in-Time 最佳化的效果,屬性並不會比欄位的成本來得高。

請參閱

概念

元件的設計階段屬性