屬性是對現實世界中實體特征的抽象,它提供了對類或對象性質的訪問。比如,一個用戶的姓名、一個文件的大小、一個窗口的標題,都可以作為屬性。類的屬性所描述的是狀態的信息,在類的某個實例中屬性的值表示該對象的狀態值。
C#中的屬性更充分地體現了對象的封裝性:不直接操作類的數據內容,而是通過訪問器進行訪問。它借助於get和set對屬性的值進行讀寫,這在C++中是需要程序員手工完成的一項工作。
12.2.1 C#屬性的聲明
C#的屬性采用如下方式進行聲明:
attributes proterty-modifiers type member-name {accessor-declarations}
屬性的修飾符property-modifiers有:
●new
●public
●protected
●internal
●private
●static
●virtual
●sealed
●override
●abstract
以上修飾符中,static,virtual,override和abstract修飾符不能同時使用。
屬性的訪問聲明accessor-declaration必須用一對“{”和“}”大括號括起來,在其中給出對屬性的值進行讀寫的操作說明。
雖然屬性和域的語法比較類似,但不能把屬性當做變量那樣使用,也不能把屬性作為引用型參數或輸出參數來進行傳遞。
12.2.2 訪問屬性的值
在屬性的訪問聲明中,對屬性的值的讀操作用get關鍵字標出,對屬性的值的寫操作用set關鍵字標出。我們看下面的例子。
程序清單12-3:
using System; public class File { private string s_filename; public string Filename{ get{ return s_filename; } set{ if(s_filename!=value){ s_filename=value; } } } } public class Test { public static void Main(){ File f=new File(); f.Filename="myfile.txt"; string s=f.Filename; } }
在屬性的訪問聲明中:
●只有set訪問器,表明屬性的值只能進行設置而不能讀出。
●只有get訪問器,表明屬性的值是只讀的,不能改寫。
●同時具有set訪問器和get訪問器,表明屬性的值的讀寫都是允許的。
除了使用了abstract修飾符的抽象屬性,每個訪問器的執行體中只有分號“;”,其它所有屬性的get訪問器都通過return來讀取屬性的值,set訪問器都通過value來設置屬性的值。
舉個例子,旅館對住宿人員進行登記,要記錄的信息有:客人改名、性別、所住的房間號、已住宿的天數。這裡,客人的姓名和性別一經確定就不能理更改了,用戶可以要求改變房間,住宿的天數當然也是不斷變化的。我們在類的構造函數中對客人的姓名和性別進行初始化,在四個屬性中,客人的姓名和性別是只讀的,故只具有get訪問器;房間號和住宿天數允許改變,同時具有set訪問器和get訪問器。
程序清單12-4:
using System; public class Customer { public enum sex { man, woman, }; public string s_name; public string Name{ get{ return s_name; } } private sex m_sex; public sex Sex{ get{ return m_sex; } } private string s_no; public string No{ get{ return s_no; } set{ if(s_no!=value){ s_no=value; } } } private int i_day; public int Day{ get{ return i_day; } set{ if(i_day!=value){ i_day=value; } } } public void Customer(string name,sex sex,string no,int day) { s_name=name; m_sex=sex; s_no=no; i_day=day; } }