在程序中,難免要訪問某個(gè)對(duì)象的私有成員。那么以前實(shí)現(xiàn)這類功能的方法有兩種,第一種方法最簡單,就是把成員訪問符從“private”改為“public”即可;而另一個(gè)就是提供公有的成員訪問函數(shù)來進(jìn)行訪問。那么現(xiàn)在用C#編寫程序,就不再需要采用前面所說的兩種方法了,而直接使用屬性來完成。
首先來看看三種方法的如何實(shí)現(xiàn)以及調(diào)用的,這里用一個(gè)例子來說明,即訪問“EmployeeInfo”類的私有成員strName,具體如下表格所示。
private string strName; 訪問方法
修改成員訪問符 修改:
private string strName;
為:
public string strName; EmployeeInfo empNew...;
string strNameValue = empNew.strName;
empNew.strName = "me";
公有成員函數(shù) 增加如下兩個(gè)成員函數(shù):
public string getName()
{
return strName;
}
public void setName( string Name )
{
strName = Name;
} EmployeeInfo empNew...;
string strNameValue = empNew.getName();
empNew.setName( "me" );
屬性 增加如下屬性:
public string Name
{
get{ return strName;}
set{ strName = value; }
}
EmployeeInfo empNew...;
string strNameValue = empNew.Name;
empNew.Name = "me";
那么這三種方法有什么區(qū)別呢,用如下的表格,可以更好的說明三者的區(qū)別。
類的封裝性 代碼安全性 代碼繁瑣性 代碼效率
修改成員訪問符 破壞類的封裝 存在潛在危險(xiǎn) 簡便
公有成員函數(shù) 沒有破壞 安全 繁瑣,而且調(diào)用不直接 最低
屬性 沒有破壞 安全 簡便 僅次于第一種方法
(備注:這里用紅色表明每一子項(xiàng)中最不好的)
因此可以看出使用屬性不但沒有破壞類的封裝性,沒有減弱代碼的安全性,而且和第一種方法一樣簡便,只是在效率方面要略低于第一種方法。但總體看來,在C#中用屬性來訪問類的私有成員是不二的選擇。
不過對(duì)于使用屬性,以及如上表格所說的,難免會(huì)有人產(chǎn)生如下一些疑問。
疑問一:就是用屬性是否能達(dá)到成員函數(shù)那樣的效果,即完成復(fù)雜的代碼操作。
其實(shí)屬性的底層實(shí)現(xiàn)是借助于成員函數(shù),只不過這部分轉(zhuǎn)換是由系統(tǒng)幫忙做的,所以在編寫屬性的時(shí)候,可以像編寫成員函數(shù)一樣,即在成員函數(shù)中所能寫的代碼片斷,完全可以在屬性中套用。下面就貼出屬性所轉(zhuǎn)換的微軟中間語言(MSIL)代碼。
.property instance string Name()
{
.get instance string NameSpace.EmployeeInfo::get_Name()
.set instance void NameSpace.EmployeeInfo::set_Name(string)
}// end of property EmployeeInfo::Name
.method public hidebysig specialname instance string get_Name() cil managed
{
...
}// end of method EmployeeInfo::get_Name
.method public hidebysig specialname instance void set_Name(string 'value') cil managed
{
...
}// end of method EmployeeInfo::set_Name
如上就是前面EmployeeInfo類的Name屬性所轉(zhuǎn)換的中間語言代碼(不過省略了函數(shù)的具體實(shí)現(xiàn)代碼,因?yàn)檫@里并不是為了研究中間語言代碼,如果需要對(duì)這部分有更多地了解,參看中間語言相關(guān)書籍)。
首先來看看三種方法的如何實(shí)現(xiàn)以及調(diào)用的,這里用一個(gè)例子來說明,即訪問“EmployeeInfo”類的私有成員strName,具體如下表格所示。
private string strName; 訪問方法
修改成員訪問符 修改:
private string strName;
為:
public string strName; EmployeeInfo empNew...;
string strNameValue = empNew.strName;
empNew.strName = "me";
公有成員函數(shù) 增加如下兩個(gè)成員函數(shù):
public string getName()
{
return strName;
}
public void setName( string Name )
{
strName = Name;
} EmployeeInfo empNew...;
string strNameValue = empNew.getName();
empNew.setName( "me" );
屬性 增加如下屬性:
public string Name
{
get{ return strName;}
set{ strName = value; }
}
EmployeeInfo empNew...;
string strNameValue = empNew.Name;
empNew.Name = "me";
那么這三種方法有什么區(qū)別呢,用如下的表格,可以更好的說明三者的區(qū)別。
類的封裝性 代碼安全性 代碼繁瑣性 代碼效率
修改成員訪問符 破壞類的封裝 存在潛在危險(xiǎn) 簡便
公有成員函數(shù) 沒有破壞 安全 繁瑣,而且調(diào)用不直接 最低
屬性 沒有破壞 安全 簡便 僅次于第一種方法
(備注:這里用紅色表明每一子項(xiàng)中最不好的)
因此可以看出使用屬性不但沒有破壞類的封裝性,沒有減弱代碼的安全性,而且和第一種方法一樣簡便,只是在效率方面要略低于第一種方法。但總體看來,在C#中用屬性來訪問類的私有成員是不二的選擇。
不過對(duì)于使用屬性,以及如上表格所說的,難免會(huì)有人產(chǎn)生如下一些疑問。
疑問一:就是用屬性是否能達(dá)到成員函數(shù)那樣的效果,即完成復(fù)雜的代碼操作。
其實(shí)屬性的底層實(shí)現(xiàn)是借助于成員函數(shù),只不過這部分轉(zhuǎn)換是由系統(tǒng)幫忙做的,所以在編寫屬性的時(shí)候,可以像編寫成員函數(shù)一樣,即在成員函數(shù)中所能寫的代碼片斷,完全可以在屬性中套用。下面就貼出屬性所轉(zhuǎn)換的微軟中間語言(MSIL)代碼。
.property instance string Name()
{
.get instance string NameSpace.EmployeeInfo::get_Name()
.set instance void NameSpace.EmployeeInfo::set_Name(string)
}// end of property EmployeeInfo::Name
.method public hidebysig specialname instance string get_Name() cil managed
{
...
}// end of method EmployeeInfo::get_Name
.method public hidebysig specialname instance void set_Name(string 'value') cil managed
{
...
}// end of method EmployeeInfo::set_Name
如上就是前面EmployeeInfo類的Name屬性所轉(zhuǎn)換的中間語言代碼(不過省略了函數(shù)的具體實(shí)現(xiàn)代碼,因?yàn)檫@里并不是為了研究中間語言代碼,如果需要對(duì)這部分有更多地了解,參看中間語言相關(guān)書籍)。