屬性是對現實世界中實體特征的抽象,它提供了對類或對象性質的訪問。比如,一個用戶的姓名、一個文件的大小、一個窗口的標題,都可以作為屬性。類的屬性所描述的是狀態的信息,在類的某個實例中屬性的值表示該對象的狀態值。
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;
}
}