WEB开发网
开发学院软件开发C语言 Effective C# 原则23:避免返回内部类对象的引用 阅读

Effective C# 原则23:避免返回内部类对象的引用

 2009-02-19 08:16:30 来源:WEB开发网   
核心提示:你已经知道,所谓的只读属性就是指调用者无法修改这个属性,Effective C# 原则23:避免返回内部类对象的引用,不幸运的是,这并不是一直有效的,不会影响到对象的内部状态,客户可以根据需求随意的修改拷贝的数据,如果你创建了一个属性,它返回一个引用类型

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

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  下一页

Tags:Effective 原则 避免

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接