亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C#箴言之用屬性來訪問類的私有成員

2019-11-18 17:09:28
字體:
來源:轉載
供稿:網友
  在程序中,難免要訪問某個對象的私有成員。那么以前實現這類功能的方法有兩種,第一種方法最簡單,就是把成員訪問符從“PRivate”改為“public”即可;而另一個就是提供公有的成員訪問函數來進行訪問。那么現在用C#編寫程序,就不再需要采用前面所說的兩種方法了,而直接使用屬性來完成。

  首先來看看三種方法的如何實現以及調用的,這里用一個例子來說明,即訪問“EmployeeInfo”類的私有成員strName,具體如下表格所示。

 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";

  那么這三種方法有什么區別呢,用如下的表格,可以更好的說明三者的區別。

 類的封裝性代碼安全性代碼繁瑣性代碼效率
修改成員訪問符破壞類的封裝存在潛在危險簡便最高
公有成員函數沒有破壞安全繁瑣,而且調用不直接最低
屬性沒有破壞安全簡便僅次于第一種方法
   ?。▊渥ⅲ哼@里用紅色表明每一子項中最不好的)

  因此可以看出使用屬性不但沒有破壞類的封裝性,沒有減弱代碼的安全性,而且和第一種方法一樣簡便,只是在效率方面要略低于第一種方法。但總體看來,在C#中用屬性來訪問類的私有成員是不二的選擇。

  不過對于使用屬性,以及如上表格所說的,難免會有人產生如下一些疑問。

  疑問一:就是用屬性是否能達到成員函數那樣的效果,即完成復雜的代碼操作。

  其實屬性的底層實現是借助于成員函數,只不過這部分轉換是由系統幫忙做的,所以在編寫屬性的時候,可以像編寫成員函數一樣,即在成員函數中所能寫的代碼片斷,完全可以在屬性中套用。下面就貼出屬性所轉換的微軟中間語言(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屬性所轉換的中間語言代碼(不過省略了函數的具體實現代碼,因為這里并不是為了研究中間語言代碼,如果需要對這部分有更多地了解,參看中間語言相關書籍)。

  疑問二:就是用屬性的效率是否僅次于第一種方法。

  從上面很容易看出,屬性在編譯的時候會轉換成和成員函數一樣的代碼,那么它的效率應該和成員函數是一樣的。其實并不是這樣,因為JIT編譯器會把屬性所轉換成的兩個成員函數作為內聯函數,這樣效率會提高很多。(注:內聯函數是代碼被插入到調用者代碼處的函數,通過避免函數調用所產生的額外開銷,從而提高執行效率。不過書中也提到,即使不是內聯函數,成員函數相對于方法一的效率損失也是微乎其微的。)

  用C#寫程序,一提到屬性,大家都會編寫。其實在屬性中,可以產生很多應用,接著來就分別說明。

 ?。?--[if !supportLists]-->1. <!--[endif]-->在屬性中使用索引符,例如像“ArrayList[i]”來訪問ArrayList某個成員。這里需要注意的是,屬性名以及索引參數的編碼格式是固定的,如“this […]”。不過索引參數可以是多個,而且不光支持整型參數,還可以使用其他類型參數。例如:

public ReturnValueType this[ ParType1 parValue1, ParType2 parValue2]
{
 get{...}
 set{...}
}

  <!--[if !supportLists]-->2. <!--[endif]-->可以給屬性操作加上互斥鎖,以防止多線程操作時而產生的并發錯誤,具體如下。

public string Name
{
 get
 {
  lock(this)
  {
   return strName;
  }
 }
 set
 {
  lock(this)
  {
   strName = value;
  }
 }
}

  <!--[if !supportLists]-->3. <!--[endif]-->書上還提到屬性的其他應用,例如:通過接口來實現在一個類中同時提供只讀屬性以及非只讀屬性。但是我個人認為,雖然這樣可以實現,但是會產生歧義,即在一個類中提供兩個不同版本的屬性,破壞了類的一致性,所以我并不推薦這么做。

  接著,要說說編寫屬性的時候,需要注意些什么,我個人認為有如下兩點大的方面。

  第一個就是編寫屬性get部分的時候,如果當前屬性的類型是引用類型的話,且不想通過屬性來修改局部成員的話,最好返回局部成員的copy,而不是成員本身。

  例如:

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 );
 }
}

  如果按照如上所寫,那么class2對象可以通過Class1.Data屬性訪問和修改局部成員myClass1某些值,這樣就可以修改了myClass2的私有成員myClass1的值,即會產生潛在錯誤。

  例如:

class1 myClass1 = myClass2.Class1;
myClass1.Data = "test2";

  如何避免這類錯誤呢,那么首先需要修改Class1屬性的編寫,其次在class1類需要提供Clone函數或者其他copy函數,具體如下:

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 );
 }
}

  第二個需要注意的是編寫屬性set部分的時候,這里需要對參數進行有效性檢查。因為屬性是外界修改類的私有成員的入口,為了避免因為私有成員不正確而產生的錯誤,所以在進行屬性set的時候要進行有效性檢查,從而保證私有成員對于整個類來說是有效的。

  那么在實際應用當中,與屬性密切相關的就是實現兩個窗體之間數據訪問,這可能是寫WinForm程序最基本的。不過很遺憾的是,網上在回答此類問題的時候,很多人都建議用第一種方法來解決。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩三级影视基地| 91在线精品视频| 亚洲国产高清高潮精品美女| 欧美国产第二页| 国产一区私人高清影院| 欧美极品欧美精品欧美视频| 欧美在线www| 正在播放亚洲1区| 国产精品人成电影在线观看| 精品日韩视频在线观看| 欧美极品xxxx| 91精品综合视频| 神马国产精品影院av| 久久精品视频导航| 亚洲自拍欧美另类| 亚洲欧美色图片| 国产精品无码专区在线观看| 精品国产鲁一鲁一区二区张丽| 九九久久综合网站| 深夜福利91大全| xxxxx91麻豆| 久久视频精品在线| 性亚洲最疯狂xxxx高清| 亚洲国产日韩欧美综合久久| 欧美—级a级欧美特级ar全黄| 中文字幕欧美亚洲| 亚洲美女激情视频| 欧美精品videossex性护士| 91在线免费观看网站| 日本aⅴ大伊香蕉精品视频| 91久久嫩草影院一区二区| 国产午夜精品一区二区三区| 亚洲精品视频中文字幕| 欧美网站在线观看| 日韩欧美成人网| 美女福利视频一区| 亚洲国产欧美一区二区三区同亚洲| 欧美影院久久久| 97超级碰碰碰久久久| 亚洲午夜女主播在线直播| 久久99久久亚洲国产| 91精品国产99| 日韩在线观看免费全| 欧美亚洲成人免费| 69久久夜色精品国产69乱青草| 久久国产精品久久久久久| 国产噜噜噜噜噜久久久久久久久| 亚洲影院色在线观看免费| 亚洲男人7777| 俺去啦;欧美日韩| 精品日韩美女的视频高清| 国内精品久久久久久中文字幕| 欧美激情精品久久久久久免费印度| 91午夜理伦私人影院| 亚洲欧美日韩精品久久亚洲区| 日韩中文字幕免费视频| 欧美精品在线网站| 91成人精品网站| 九九热视频这里只有精品| 国产久一一精品| 日韩美女毛茸茸| 91精品国产91久久久久福利| 中文字幕精品国产| 91av视频导航| 第一福利永久视频精品| 日韩美女av在线免费观看| 久久精品久久久久久国产 免费| 亚洲视频一区二区| 国产成人久久精品| 大伊人狠狠躁夜夜躁av一区| 97av在线影院| 日本午夜精品理论片a级appf发布| 国产偷国产偷亚洲清高网站| 97人洗澡人人免费公开视频碰碰碰| 久久久久久久香蕉网| 日韩电影在线观看永久视频免费网站| 97在线视频一区| 久久亚洲一区二区三区四区五区高| 亚洲精品久久久久久久久久久| 中文字幕一区二区三区电影| 俺也去精品视频在线观看| 亚洲天堂av在线免费观看| 欧美壮男野外gaytube| www国产精品视频| 成人久久久久久| 日韩电影中文字幕在线观看| 日韩欧美极品在线观看| 丝袜美腿亚洲一区二区| 亚洲视频国产视频| 国产精品久久久久免费a∨大胸| 久久久欧美精品| 亚洲无av在线中文字幕| 欧美黑人狂野猛交老妇| 色综合久久久久久中文网| 91美女片黄在线观| 国产在线日韩在线| 日韩电影在线观看永久视频免费网站| 91精品视频播放| 日韩激情视频在线| 久青草国产97香蕉在线视频| 亚洲精品自在久久| 92国产精品久久久久首页| 国产欧美日韩免费| 亚洲最大福利网站| 欧美日韩性生活视频| 精品国产一区二区三区在线观看| 一本一本久久a久久精品牛牛影视| 久久综合伊人77777蜜臀| 亚洲欧美日韩视频一区| 亚洲乱码国产乱码精品精| 亚洲综合在线做性| 欧美巨猛xxxx猛交黑人97人| 久久免费精品日本久久中文字幕| 国模视频一区二区三区| 欧美精品videosex性欧美| 亚洲视频欧美视频| 亚洲电影免费观看高清| 精品国产一区二区三区久久久狼| 国产精品网站入口| 亚洲韩国青草视频| 国产免费成人av| 久久成人在线视频| 在线看国产精品| 久久亚洲春色中文字幕| 亚洲无av在线中文字幕| 2019亚洲男人天堂| 亚洲性生活视频在线观看| 国产一区av在线| 久久亚洲精品成人| 91美女片黄在线观| 欧美日本在线视频中文字字幕| 国产精品久久久av| 亚洲最大av网站| 中文字幕亚洲一区在线观看| 国产偷亚洲偷欧美偷精品| 2018日韩中文字幕| 亚洲性猛交xxxxwww| 国产成人aa精品一区在线播放| 午夜精品久久17c| 51视频国产精品一区二区| 国产欧美 在线欧美| 亚洲色图狂野欧美| 欧美午夜精品久久久久久久| 精品无人国产偷自产在线| 亚洲视频精品在线| 亚洲精品小视频在线观看| 久久精品视频一| 亚洲自拍小视频| 日韩精品视频在线播放| 欧美乱大交做爰xxxⅹ性3| 高清欧美一区二区三区| 精品欧美国产一区二区三区| 亚洲第一页中文字幕| 日韩精品视频三区| 精品国内产的精品视频在线观看| 国产精品视频大全| 欧美精品在线视频观看| 欧美午夜精品久久久久久浪潮| 亚洲午夜久久久影院| 77777亚洲午夜久久多人| 亚洲精品国产福利| 欧美另类高清videos| 2019亚洲男人天堂| 北条麻妃99精品青青久久|