![]() ![]() |
|
C#箴言之用属性来访问类的私有成员 | |
作者:佚名 文章来源:不详 点击数 更新时间:2008/3/16 9:43:55 文章录入:杜斌 责任编辑:杜斌 | |
|
|
首先来看看三种方法的如何实现以及调用的,这里用一个例子来说明,即访问“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属性所转换的中间语言代码(不过省略了函数的具体实现代码,因为这里并不是为了研究中间语言代码,如果需要对这部分有更多地了解,参看中间语言相关书籍)。 |
|
![]() ![]() |