**屬性結合了字段和方法的多個方面。 對於對象的用戶,屬性顯示爲字段,訪問該屬性需要相同的語法。 對於類的實現者,屬性是一個或兩個代碼塊,表示一個 get 訪問器和/或一個 set 訪問器。 當讀取屬性時,執行 get 訪問器的代碼塊;當向屬性分配一個新值時,執行 set 訪問器的代碼塊。 不具有 set 訪問器的屬性被視爲只讀屬性。 不具有 get 訪問器的屬性被視爲只寫屬性。 同時具有這兩個訪問器的屬性是讀寫屬性。
與字段不同,屬性不作爲變量來分類。 因此,不能將屬性作爲 ref參數或 out參數傳遞。
屬性具有多種用法:它們可在允許更改前驗證數據;它們可透明地公開某個類上的數據,該類的數據實際上是從其他源(例如數據庫)檢索到的;當數據被更改時,它們可採取行動,例如引發事件或更改其他字段的值。
屬性在類塊中是按以下方式來聲明的:指定字段的訪問級別,接下來指定屬性的類型和名稱,然後跟上聲明 get 訪問器和/或 set 訪問器的代碼塊。 例如:**
public class Date
{
private int month = 7; // Backing store
public int Month
{
get
{
return month;
}
set
{
if ((value > 0) && (value < 13))
{
month = value;
}
}
}
}
在此示例中,Month 是作爲屬性聲明的,這樣 set 訪問器可確保 Month 值設置爲 1 和 12 之間。 Month 屬性使用私有字段來跟蹤該實際值。 屬性的數據的真實位置經常稱爲屬性的“後備存儲”。屬性使用作爲後備存儲的私有字段是很常見的。 將字段標記爲私有可確保該字段只能通過調用屬性來更改。 有關公共和私有訪問限制的更多信息,請參見訪問修飾符。
get 訪問器
get 訪問器體與方法體相似。 它必須返回屬性類型的值。 執行 get 訪問器相當於讀取字段的值。 例如,當正在從 get 訪問器返回私有變量並且啓用了優化時,對 get 訪問器方法的調用由編譯器進行內聯,因此不存在方法調用的系統開銷。 然而,由於在編譯時編譯器不知道在運行時實際調用哪個方法,因此無法內聯虛擬 get 訪問器。 以下是返回私有字段 name 的值的 get 訪問器:
class Person
{
private string name; // the name field
public string Name // the Name property
{
get
{
return name;
}
}
}
當引用屬性時,除非該屬性爲賦值目標,否則將調用 get 訪問器以讀取該屬性的值。 例如:
Person person = new Person();
//...
System.Console.Write(person.Name); // the get accessor is invoked here
set 訪問器
set 訪問器類似於返回類型爲 void 的方法。 它使用稱爲 value 的隱式參數,此參數的類型是屬性的類型。 在下面的示例中,將 set 訪問器添加到 Name 屬性:
class Person
{
private string name; // the name field
public string Name // the Name property
{
get
{
return name;
}
set
{
name = value;
}
}
}
當對屬性賦值時,用提供新值的參數調用 set 訪問器。 例如:
Person person = new Person();
person.Name = "Joe"; // the set accessor is invoked here
System.Console.Write(person.Name); // the get accessor is invoked here