屬性背後實現為兩個函式(get 取值、set 指派),從中介語言代碼清晰可見。但確在語言層面實現面向物件一直訴求的「屬性」特殊介面。C# 不提倡將欄位設 public 任意操作——太不安全!對所有需在類別外可見的欄位,建議用屬性表達。屬性不代表儲存位置,這是與欄位根本差異。
class MyClass
{
int integer;
public int Integer
{
get { return integer; }
set { integer = value; }
}
}
class Test
{
public static void Main()
{
MyClass obj = new MyClass();
Console.Write(obj.Integer); // 0
obj.Integer++;
Console.Write(obj.Integer); // 1
}
}
value 為 C# 關鍵字,為 set 隱含參數(指派操作右值)。
屬性提供唯讀(get)、唯寫(set)、讀寫(get+set)三種介面。對欄位這三種操作,必須在同一屬性名下宣告,不可分離:
// 錯誤寫法:分離 Name 屬性
class MyClass
{
private string name;
public string Name { get { return name; } }
public string Name { set { name = value; } } // 編譯錯誤!
}
class MyClass
{
protected int num = 0;
public int Num { set { num = value; } } // 唯寫
}
class MyClassDerived : MyClass
{
new public int Num { get { return num; } } // 唯讀,隱藏基類 Num
}
class Test
{
public static void Main()
{
MyClassDerived obj = new MyClassDerived();
// obj.Num = 1; // 錯誤!Derived 隱藏了基類 set
((MyClass)obj).Num = 1; // 必須轉型呼叫基類 set
}
}
C# 視三種屬性為同一屬性名,MyClassDerived 中 Num 的 get 隱藏了 MyClass 中 Num 的 set。