1、C#屬性,用如下代碼定義一個屬性:
1 private string name; 2 public string Name 3 { 4 get { return name; } 5 set { name = value; } 6 }
第1行定義了一個變量,這是屬性所依賴的基礎變量。2-6行代碼定義了一個Name屬性,類的使用者可以通過Name屬性對類中的基礎變量進行讀取和修改。如:
1 Student student = new Student(); 2 3 student.Name = "Nick";
在屬性的使用者看來,屬性就像類裡面有一個具有public訪問權限的變量,但事實情況並非如此。前面代碼中定義的Name屬性其實定義了兩個特殊方法,GetName和SetName方法,分別用來讀取和修改類中的私有變量Name。
第4行代碼稱為屬性的讀取讀取方法(getter)。屬性的讀取方法必須返回與屬性相同的類型。當有代碼讀取屬性時,讀方法就被調用,並且將返回值交給調用屬性的代碼。
第6行代碼是屬性的設置方法(setter),設置方法接受一個與屬性類型相同的入口參數,並且在C#中規定這個入口參數名稱為value,所以在屬性的設置方法中可以不用聲明直接使用value變量。當對屬性進行賦值時setter方法被調用。
C#中的屬性一般具有一個get方法和一個set方法,get方法用於讀取屬性值,set方法用於設置屬性值,但並非都是必須的,屬性可以只有get方法或set方法,只有get方法的屬性只可以讀取,只有set方法的屬性只能寫入,不能讀取。
使用屬性的好處:隱藏數據成員,提高程序的健壯性和靈活性。
利用屬性校驗數據,通過使用屬性,可以對數據進行驗證,避免接受不合法的數據,提高程序健壯性。如下面例子,通過屬性限制age的值。
1 class Student 2 { 3 private string name; 4 public string Name 5 { 6 get { return name; } 7 set { name = value; } 8 } 9 10 private int age; 11 public int Age 12 { 13 get { return age; } 14 set 15 { 16 if (value < 0 || value > 120) 17 { 18 Console.WriteLine("Invaild age!!"); 19 20 return; 21 } 22 else 23 { 24 age = value; 25 26 Console.WriteLine("Age set to: {0}", age); 27 } 28 } 29 } 30 } 31 32 static void Main(string[] args) 33 { 34 Student student = new Student(); 35 36 Console.WriteLine("Set student name : Nick"); 37 student.Name = "Nick"; 38 Console.WriteLine("Set student age: 25"); 39 student.Age = 25; 40 Console.WriteLine("Student " + student.Name + "'s age is {0}!", student.Age); 41 42 Console.WriteLine("Set student age: 140"); 43 student.Age = 140; 44 45 Console.WriteLine("Student " + student.Name + "'s age is {0}!", student.Age); 46 47 Console.WriteLine("Press enter to exit!"); 48 Console.ReadLine(); 49 }
運行結果如下:
1 Set student name : Nick 2 Set student age: 25 3 Age set to: 25 4 Student Nick's age is 25! 5 Set student age: 140 6 Invaild age!! 7 Student Nick's age is 25! 8 Press enter to exit!
屬性其實是一種特殊的方法,而不是一個變量。有時候屬性的確是對類中成員變量的封裝,但很多時候也不是這樣。