首页 | 麦客学吧 | 视频教程 | FLASH小游戏 | 素材下载 | 常用工具
您当前的位置:首页 > 程序开发 > C# > 正文

C#箴言之用属性来访问类的私有成员

出处:麦客学吧 [2007-6-28 17:49:16] 作者:佚名 点击数:218

讨论交流:http://x8.maicoo.com/team/8761.html

  在程序中,难免要访问某个对象的私有成员。那么以前实现这类功能的方法有两种,第一种方法最简单,就是把成员访问符从“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#写程序,一提到属性,大家都会编写。其麦客学吧

【责任编辑: lanier

素材中心
麦客酷站赏析频道

精彩图文推荐

关于本站 - 联系站长 - 广告服务 - 合作伙伴 - 网站地图 - 版权声明 - 报告错误 - 收藏本站 | Http://www.MaiCoo.com

Copyright © 2005 - 2008 MaiCoo.com All Rights Reserved

违法和不良信息举报中心 本站服务器空间和带宽由雷克斯网络提供赞助
浙ICP备06017818号