在面向對象編程(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”。
文章轉載自:http://blog.csdn.net/u013095889/article/details/52804360