1、C#屬性,用如下代碼定義一個屬性:
private string name; public string Name { get { return name; } set { name = value; } }
第1行定義了一個變量,這是屬性所依賴的基礎變量。2-6行代碼定義了一個Name屬性,類的使用者可以通過Name屬性對類中的基礎變量進行讀取和修改。如:
Student student = new Student(); 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的值。
class Student { private string name; public string Name { get { return name; } set { name = value; } } private int age; public int Age { get { return age; } set { if (value < 0 || value > 120) { Console.WriteLine("Invaild age!!"); return; } else { age = value; Console.WriteLine("Age set to: {0}", age); } } } } static void Main(string[] args) { Student student = new Student(); Console.WriteLine("Set student name : Nick"); student.Name = "Nick"; Console.WriteLine("Set student age: 25"); student.Age = 25; Console.WriteLine("Student " + student.Name + "'s age is {0}!", student.Age); Console.WriteLine("Set student age: 140"); student.Age = 140; Console.WriteLine("Student " + student.Name + "'s age is {0}!", student.Age); Console.WriteLine("Press enter to exit!"); Console.ReadLine(); }
運行結果如下:
Set student name : Nick Set student age: 25 Age set to: 25 Student Nick's age is 25! Set student age: 140 Invaild age!! Student Nick's age is 25! Press enter to exit!
屬性其實是一種特殊的方法,而不是一個變量。有時候屬性的確是對類中成員變量的封裝,但很多時候也不是這樣。