C#中的屬性
公眾號「DotNet學習交流」,分享學習DotNet的點滴。
簡介
屬性是代表類的實例或類中的一個數據項的成員,使用屬性看起來非常像寫入或讀取一個字段,語法是相同的。
下面的代碼展示了名稱為D的類的使用,它有一個公有字段和一個公有屬性,從用法無法區分它們。
D d = new D();
?
d.MyField = 7; //給字段賦值
d.MyProperty = 10; //給屬性賦值
Console.WriteLine($"{d.MyField} {d.MyProperty}"); //讀取字段和屬性
與字段類似,屬性有如下特征:
1、它是命名的類成員。
2、它有類型。
3、它可以被賦值和讀取。
和字段不同的是,屬性是一個函數成員。
1、它不為數據存儲分配內存。
2、它執行代碼。
一個關于屬性的簡單示例
代碼如下:
public class Person
{
private string name; // 私有字段
?
public string Name
{
get
{
// 這是屬性的get訪問器,用于獲取屬性的值
return name;
}
set
{
// 這是屬性的set訪問器,用于設置屬性的值
name = value;
}
}
}
這個示例的圖示如下:
在這個示例中,Name 屬性提供了對 name 字段的訪問,但它本身并不存儲數據。當您使用 person.Name 讀取屬性時,實際上調用了屬性的get訪問器來獲取字段的值,而當您使用 person.Name = "John" 設置屬性時,實際上調用了屬性的set訪問器來設置字段的值。
屬性聲明和訪問器
set和get訪問器有預定義的語法和語義。可以把set訪問器想象成一個方法,帶有單一的參數“設置”屬性的值,get訪問器沒有參數并從屬性返回一個值。
set訪問器的特點:
1、有一個單獨的、隱式的值參,名稱為value,與屬性的類型相同。
2、返回類型void。
get訪問器的特點:
1、沒有參數。
2、返回類型與屬性類型相同。
屬性和關聯字段
屬性常和字段關聯,一種常見的方式是在類中將字段聲明為private以封裝該字段,并聲明一個public屬性來控制從類的外部對該字段的訪問,和屬性關聯的字段常被稱為后備字段或后備存儲。
屬性和它們的后備字段有幾種命名約定。
一種約定是兩個名稱使用相同的內容,但字段使用Camel大小寫,屬性使用Pascal大小寫。(Camel大小寫風格中,復合詞標識符中每個單詞的首字母大寫,出來第一個單詞,其余字母都是小寫,Pascal大小寫風格中,復合詞中每個單詞的首字母都是大寫。)
另一種約定是屬性使用Pascal大小寫,字段使用相同標識符的Camel大小寫版本,并以下劃線開始。
兩種約定的示例代碼如下:
// 第一種約定的寫法
private int firstField; // Camel大小寫
public int FirstField // Pascal大小寫
{
get { return firstField; }
set { firstField = value;}
}
?
// 第二種約定的寫法
private int _secondField; // 下劃線及Camel大小寫
public int SecondField // Pascal大小寫
{
get { return _secondField; }
set { _secondField = value; }
}
只讀和只寫屬性
要想不定義屬性的某個訪問器,可以忽略該訪問器的聲明。
只有get訪問器的屬性稱為只讀屬性。只讀屬性是一種安全的,把一項數據從類或類的實例中傳出,而不允許太多訪問方法。
只有set訪問器的屬性稱為只寫屬性。只寫屬性是一種安全的,把一項數據從類的外部傳入類,而不允許太多的訪問的方法。
兩個訪問器至少有一個必須定義,否則編譯器會報錯,如下圖所示:

自動實現屬性
因為屬性經常被關聯到后備字段,C#提供了自動實現屬性(automatically implemented property),允許只聲明屬性而不聲明后備字段,編譯器會為我們創建隱藏的后備字段,并且自動掛接到get和set訪問器上。
自動實現屬性的注意點:
1、不聲明后備字段,編譯器會根據屬性的類型分配存儲。
2、不能提供訪問器的方法體,它們必須被簡單地聲明為分號。get擔當簡單的內存讀,set擔當簡單的寫。
3、只有通過訪問器才能訪問后備字段。因為不能用其他的方法訪問它,所以實現只讀和只寫屬性沒有意義,因此必須同時提供讀寫訪問器。
一個自動實現屬性的示例,代碼如下:
public class Person
{
public string Name // 沒有聲明后備字段
{
get; set; // 訪問器的方法體被聲明為分號
}
?
}
internal class Program
{
static void Main(string[] args)
{
Person person = new Person();
Console.WriteLine(person.Name); // 想使用規則屬性那樣使用自動屬性
person.Name = "小王";
Console.WriteLine(person.Name);
}
}
運行結果如下圖所示:

參考資料
《C#圖解教程(第4版)》——Daniel M. Solis


浙公網安備 33010602011771號