C#中的set和get方法
在面向物件程式設計(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度,程式碼修改前執行結果為“40”,程式碼修改後執行結果為“-233.15”。