屬性本質上是方法,我們可以在屬性的取值(get)或指派(set)邏輯中,根據程式需求執行檢查、警告等額外操作。請看下例:
class MyClass
{
private string name;
public string Name
{
get { return name; }
set
{
if (value == null)
name = "Microsoft";
else
name = value;
}
}
}
屬性具備方法的各種修飾特性。屬性同樣有 5 種存取修飾詞,但通常為 public,否則失去作為類別公開介面的意義。除了方法因多參數具備多載特性外,virtual、sealed、override、abstract 等修飾詞對屬性與方法行為相同。但因屬性本質實現為兩個方法(get/set),某些行為需特別注意:
abstract class A
{
int y;
public virtual int X
{
get { return 0; }
}
public virtual int Y
{
get { return y; }
set { y = value; }
}
public abstract int Z { get; set; }
}
class B : A
{
int z;
public override int X
{
get { return base.X + 1; }
}
public override int Y
{
// 僅覆寫 set 存取子
set { base.Y = value < 0 ? 0 : value; }
}
public override int Z
{
get { return z; }
set { z = value; }
}
}
此例集中展示屬性在繼承脈絡中的典型行為:
abstract。base 關鍵字存取父類別 A 的屬性。Y 的 set 存取子即覆寫了類別 A 中的虛擬屬性。靜態屬性與靜態方法相同,只能存取類別的靜態欄位變數。我們也可以像宣告外部方法那樣,宣告外部屬性(extern)。