當然屬性遠遠不止僅僅限於域的接口操作,屬性的本質還是方法,我們可以根據程序邏輯在屬性的提取或賦值時進行某些檢查,警告等額外操作,看下面的例子:
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等修飾符對屬性與方法同樣的行為,但由於屬性在本質上被實現為兩個方法,它的某些行為需要我們注意。看下面的例子:
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 { base.Y = value < 0? 0: value; }
}
public override int Z
{
get { return z; }
set { z = value; }
}
}
這個例子集中地展示了屬性在繼承上下文中的某些典型行為。這裡,類A由於抽象屬性Z的存在而必須聲明為abstract。子類B中通過base關鍵字來引用父類A的屬性。類B中可以只通過Y-set便覆蓋了類A中的虛屬性。
靜態屬性和靜態方法一樣只能存取類的靜態域變量。我們也可以像做外部方法那樣,聲明外部屬性