屬性概觀
元件應該定義屬性,而非公用欄位,因為 Visual Studio 這類視覺化設計工具 (Visual Designer) 在屬性瀏覽器中顯示的是屬性,而不是欄位 (其他一些應該定義屬性的理由已列於本主題結尾)。
屬性就像是智慧型欄位。 屬性通常擁有隨伴存取子函式的私用資料成員,並且在語法上是當做類別的欄位來存取 (雖然屬性可以擁有不同的存取層級,不過這裡討論的只專注於較常見的公用存取情況)。由於屬性早已使用於好幾版的 Visual Basic 中,所以 Visual Basic 程式設計人員可以略過這個主題。
屬性定義通常是由下列兩個部分組成:
私用資料成員的定義。
private int number = 0;
Private number As Integer = 0
使用屬性宣告語法的公用屬性定義。 這個語法會透過 get 和 set 存取子函式將私用資料成員與公用屬性關聯。
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
get 和 set 方法通常和其他方法並無不同。 它們可以執行任何程式邏輯、擲回例外狀況、被覆寫,而且可以使用程式語言所允許的任何修飾詞宣告。 不過,也請注意,屬性也可以是靜態的。 如果屬性是靜態的,對於 get 和 set 方法能做執行的內容會有一些限制。 如需詳細資訊,請參閱您的程式語言手冊。
屬性的型別可以是基本型別、基本型別的集合、使用者定義型別或使用者定義型別的集合。 對於所有基本型別,.NET Framework 提供實作字串至數值轉換的型別轉換子 (Type Converter)。 如需詳細資訊,請參閱一般性型別轉換。 如果屬性有型別轉換子,它就可以顯示在設計工具的屬性瀏覽器中。 如果您要定義自訂屬性並且希望屬性瀏覽器能顯示它們,那麼您必須實作自訂型別轉換子。
當屬性的資料型別是列舉型別時,Microsoft Visual Studio 這類的開發環境會在 [屬性] 視窗中將屬性顯示為下拉式清單。 如果屬性的資料型別是具有屬性的類別,那麼這些屬性就被稱為定義屬性的子屬性。 在 Visual Studio 的 [屬性] 視窗中,使用者可以展開屬性以顯示出其子屬性。
在設計階段必須將屬性 (Attribute) 加入到屬性 (Property),以便讓它們能適當地顯示在屬性瀏覽器中。 如需詳細資訊,請參閱元件的設計階段屬性。
您應該從元件公開 (Expose) 屬性來取代公用欄位,因為屬性能夠訂定版本,它們允許資料隱藏,而且存取子方法可以執行其他邏輯。 一般而言,由於 Just-in-Time 最佳化的效果,屬性並不會比欄位的成本來得高。