屬性看起來像字段,但本質上是方法。使用屬性保持了較好的數據封裝,它使類型的數據字段不會被公開,從而確保了對象的狀態永遠不被破壞。
一,定義屬性
代碼如下:
public sealed class Employee { //私有字段(支持字段) private string name; private int age; public string Name { get//get訪問器 { return name; } set//set訪問器 { name = value;//value為隱藏字段,總是代表新值 } } public int Age { get { return age; } set { //set訪問器中可以加入判斷邏輯 if (value < 0 || value > 100) { throw new ArgumentOutOfRangeException("value", value.ToString(), "The value must be between 0 and 100!"); } age = value; } } }
二,調用屬性
代碼如下:
class Program { static void Main(string[] args) { Employee e = new Employee(); e.Name = "Mcgrady";//set員工姓名 string employeeName = e.Name;//get員工姓名 Console.WriteLine(employeeName);//顯示"Mcgrady" e.Age = 32;//set員工年齡 e.Age = -5;//拋出ArgumentOutOfRangeException異常 int employeeAge = e.Age;//get員工年齡 Console.WriteLine(employeeAge);//顯示"32" } }
總結:1,可以將屬性想象成智能字段,即背后有額外邏輯的字段。
2,每個屬性都有一個名稱和一個類型,並且類型不能是void,而且屬性不能重載。
3,可以定義只讀屬性或只寫屬性。省略set方法表示定義一個只讀屬性,而省略get方法表示定義一個只寫屬性。
4,編譯器在你指定的屬性名之前附加get_或set_前綴,從而自動生成這些方法的名字。
5,除了生成訪問器方法,針對源代碼中定義的每一個屬性,編譯器還會在托管程序集(dll)的元數據中生成一個屬性定義項。
三,自動屬性AIP
自動屬性AIP(Automatically Implemented Property),它是定義屬性的一種更簡潔的方式。例如上面例子中的屬性可以使用自動屬性定義為:
public sealed class Employee { //自動屬性 public string Name { get; set; } public int Age { get; set; } }
當然它的調用方法和運行結果與普通屬性沒有什么區別。不過需要注意的地方是:
1,AIP的get和set方法上不能添加斷點,所以不利於調試查錯。
2,AIP屬性必須同時是可讀和可寫的,也就是說編譯器必然會同時生成get和set方法。