當一個類別被外部使用時,我們可能透過方法(函式)將內部的資料傳給外界來使用,而不是讓外界直接存取資料,例如將以下類別公開薪水的直接操控方式:
public class 員工
{
public int 薪水 = 36000;
}
改成為以下用方法讀取的方式:
public class 員工
{
private int 薪水 = 36000;
public void 調整薪水(int 調整值)
{
薪水 = 薪水 + 調整值;
}
public int 拿薪資()
{
return 薪水;
}
}
可以看到將薪水設定成private後,外部使用這個類別都只能透過 拿薪資方法與調整薪水方法,來拿到薪水、調整薪水。以上這種方式被稱為取值方法(accessor method)與存值方法(mutator method)。
透過方法可以讓物件內部在存取的過程中自己調整,例如以下:
public void 調整薪水(int 調整值)
{
薪水 = 薪水 + 調整值 * 1.5;
}
public int 拿薪資()
{
return 薪水 * 1.2;
}
Property中文上翻譯成屬性,我在2002年出版C#精要上看是被翻譯成內容函式,我個人比較喜歡用內容函式來稱呼,畢竟屬性感覺有靜態特徵的感覺,又容易跟attributec混淆,Property本質是種函式,是取值方法與存值方法的簡寫。
C# 1.0提供Property可以透過get、set與傳入值value關鍵字,讓我們將先前的取值方法與存值方法寫簡潔一點,並讓我們在使用的過程中看起來就是在使用欄位(field)的資料,如以下:
若不想讓外部設定set內容,可以省略set{}不實作。
C# 2.0 開始可以在get或set前面加入存取修飾詞例如private、internal或protected,未加上的話就是1.0預設public get與public set。
C# 3.0 提供自動實作Property(內容函式),可以讓我們少打一些字,自動產生私密薪水、取值方法(accessor method)與存值方法(mutator method)
背後會自動產生為以下程式碼
public class 員工
{
private int _薪水 ;
public int 薪水
{
get
{
return _薪水;
}
set
{
_薪水 = value;
}
}
}
C#編譯器提示可以自動替換
當讓這是自動產生的程式碼是預設內容,方法中有額外操作便只能依原先方式手動撰寫
若要自動實作的Property,在建構函式初始化後,使內部也不能在更改,達到唯讀Property,C#6.0開始可以省略set來使用自動實作Property,使初始化後,內部也不能在更改。