在物件導向編程(OOP)中,要求把是不允許外界直接對類的成員變數直接存取的,既然不能訪問,那定義這些成員變數還有什麼意義呢?所以C#中就要用set和get方法來訪問私人成員變數,它們相當於外界訪問對象的一個通道,一個“介面”。先來看一段代碼:
class Employee { private string name; private byte age; public string Name { get { return name; } set { name = value; } } public byte Age { get { return age; } set { age = value; } } } 代碼中定義了兩個私人變數name和age,當我們不想讓外界隨意訪問該私人變數時,可以使用屬性來訪問,文法為:
public <傳回型別(要與被訪問變數的類型相同)> <屬性名稱(不能與被訪問變數同名)> { get{ return <被訪問變數>;} set{ <被訪問變數> = value;} } 當我們使用屬性來訪問私人成員變數時就會調用裡面的get方法,當我們要修改該變數時就會調用set方法,當然在定義的時候可以只定義一個get方法或只定義一個set方法。如果只定義get方法,那麼這個相應變數就是“唯讀”的;如果只定義set方法,那麼相應變數就是“唯寫”的。
看到這時,我有個問題,既然外界可以通過set和get訪問類內私人成員,那為什麼不直接把它定義成共有,直接供外界訪問呢?拿上面的Employee類來說明:
class Employee { private string name; private byte age; public string Name { get { return name; } set { name = value; } } //****修改後****↓↓↓↓↓↓↓↓ public byte Age { get { return age; } set { if (value > 10 && value<=100) //一般在公司僱員的年齡都在10到100歲之間 age = value; } } //****修改後****↑↑↑↑↑↑↑↑ } 相信看完這個例子就能夠很清楚了,例子中,set就像一位門衛大叔一樣,只有好人才能進來。可以通過屬性來
控制對員變數的讀寫,防止對成員變數的非法賦值等。
前幾天學術交流會上剛說到了客戶變更的問題,它們在這方面就有非同小可的作用,還是舉個小例子:
有一個溫度計的類:
class Thermometer { private double temperature; public Thermometer(double temperature) //建構函式 { this.temperature = temperature; } public double Temperature { get { return temperature; } set { temperature = value; } } }
假設這裡的溫度單位表示的是攝氏度(℃),如果在需求分析階段誤解了客戶的原始意願或者客戶在日後變更了需求,需要把系統中所有表示溫度的變數temperature都用來表示開爾文溫度(K)。那麼不必動系統中成百上千個Temperature屬性,只需在get和set函數中稍微修改一下代碼即可:
class Thermometer { private double temperature; public Thermometer(double temperature) //建構函式 { this.temperature = temperature; } public double Temperature { //****修改後****↓↓↓↓↓↓↓↓ get { return temperature-273.15; } set { temperature = value+273.15; } //****修改後****↑↑↑↑↑↑↑↑ } } 下面簡單建一個控制台應用程式來測試一下,主函數為:
class Test { static void Main(string[] args) { Thermometer a = new Thermometer(40); Console.WriteLine(a.Temperature); } } 用建構函式給溫度設的初值為40度,因此代碼修改前運行結果為:
代碼修改後運行結果為:
如有不足與紕漏,懇請您留下寶貴意見與建議,感激不盡!