private string strName; | 訪問方法 | |
修改成員訪問符 | 修改: private string strName; 為: public string strName; | EmployeeInfo empNew...; string strNameValue = empNew.strName; empNew.strName = "me"; |
公有成員函數 | 增加如下兩個成員函數: 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"; |
類的封裝性 | 代碼安全性 | 代碼繁瑣性 | 代碼效率 | |
修改成員訪問符 | 破壞類的封裝 | 存在潛在危險 | 簡便 | 最高 |
公有成員函數 | 沒有破壞 | 安全 | 繁瑣,而且調用不直接 | 最低 |
屬性 | 沒有破壞 | 安全 | 簡便 | 僅次于第一種方法 |
.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屬性所轉換的中間語言代碼(不過省略了函數的具體實現代碼,因為這里并不是為了研究中間語言代碼,如果需要對這部分有更多地了解,參看中間語言相關書籍)。
疑問二:就是用屬性的效率是否僅次于第一種方法。
從上面很容易看出,屬性在編譯的時候會轉換成和成員函數一樣的代碼,那么它的效率應該和成員函數是一樣的。其實并不是這樣,因為JIT編譯器會把屬性所轉換成的兩個成員函數作為內聯函數,這樣效率會提高很多。(注:內聯函數是代碼被插入到調用者代碼處的函數,通過避免函數調用所產生的額外開銷,從而提高執行效率。不過書中也提到,即使不是內聯函數,成員函數相對于方法一的效率損失也是微乎其微的。)
用C#寫程序,一提到屬性,大家都會編寫。其實在屬性中,可以產生很多應用,接著來就分別說明。
?。?--[if !supportLists]-->1. <!--[endif]-->在屬性中使用索引符,例如像“ArrayList[i]”來訪問ArrayList某個成員。這里需要注意的是,屬性名以及索引參數的編碼格式是固定的,如“this […]”。不過索引參數可以是多個,而且不光支持整型參數,還可以使用其他類型參數。例如:
public ReturnValueType this[ ParType1 parValue1, ParType2 parValue2] { get{...} set{...} } |
public string Name { get { lock(this) { return strName; } } set { lock(this) { strName = value; } } } |
public class class1 { string _data; public class1( string data ) { _data = data; } public string Data { get{ return _data;} set{ _data = value;} } } public class class2 { private class1 myClass1 = null; public class1 Class1 { get{ return myClass1; } } public string Data { get{ return myClass1.Data;} } public class2( string data ) { myClass1 = new class1( data ); } } |
class1 myClass1 = myClass2.Class1; myClass1.Data = "test2"; |
public class class1:ICloneable { string _data; public class1( string data ) { _data = data; } public string Data { get{ return _data;} set{ _data = value;} } #region ICloneable Members public object Clone() { // TODO: Add class1.Clone implementation return new class1( _data ); } #endregion } public class class2 { private class1 myClass1 = null; public class1 Class1 { get{ return myClass1.Clone() as class1; } } public string Data { get{ return myClass1.Data;} } public class2( string data ) { myClass1 = new class1( data ); } } |
新聞熱點
疑難解答