当前位置:主页   - 电脑 - 程序设计 - C#
Effective C# 原则23:避免返回内部类对象的引用
来源:网络   作者:   更新时间:2012-03-20
收藏此页】    【字号    】    【打印】    【关闭

  你已经知道,所谓的只读属性就是指调用者无法修改这个属性。不幸运的是,这并不是一直有效的。如果你创建了一个属性,它返回一个引用类型,那么调用者就可以访问这个对象的公共成员,也包括修改这些属性的状态。例如:

public class MyBusinessObject
{
 // Read Only property providing access to a
 // private data member:
 private DataSet _ds;
 public DataSet Data
 {
  get
  {
   return _ds;
  }
 }
}
// Access the dataset:
DataSet ds = bizObj.Data;
// Not intended, but allowed:
ds.Tables.Clear( ); // Deletes all data tables.

  任何MyBusinessObject的公共客户都可以修改你的内部dateset。你创建的属性用来隐藏类的内部数据结构,你提供了方法,让知道该方法的客户熟练的操作数据。因此,你的类可以管理内部状态的任何改变。然而,只读属性对于类的封装来说开了一个后门。当你考虑这些问题时,它并不是一个可读可写属性,而是一个只读属性。

  欢迎来到一个精彩的基于引用的系统,任何返回引用的成员都会返回一个对象的句柄。你给了调用者一个接口的句柄,因此调用者修改这个对象的某个内部引用时,不再需要通过这个对象。

  很清楚,你想防止这样的事情发生。你为你的类创建了一个接口,同时希望用户使用这个接口。你不希望用户在不明白你的意图时,访问并修改对象的内部状态。你有四个策略来保护你的内部数据结构不被无意的修改:值类型,恒定类型,接口和包装(模式)。

  值类型在通过属性访问时,是数据的拷贝。客户对类的拷贝数据所做的任何修改,不会影响到对象的内部状态。客户可以根据需求随意的修改拷贝的数据。这对你的内部状态没有任意影响。

其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明