您的位置:首页 > Web前端

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

2010-01-17 00:28 369 查看
当我们将属性置为只读后,就可以认为调用者对该属性的值不可以进行更改了吗?答案是否定的。对于值类型来说,将其置为只读,确实可以让调用者不能够对其进行修改;但是对于引用类型来说,调用者还是可以调用引用对象的公有成员,包括那些可以修改属性状态的成员。

我们来看下面的代码。

代码

public class MyBusinessObject
{
// Read Only property providing access to a
// private data member:
private DataSet _ds;
public IList this[ string tableName ]
{
get
{
DataView view =
_ds.DefaultViewManager.CreateDataView
( _ds.Tables[ tableName ] );
view.AllowNew = false;
view.AllowDelete = false;
view.AllowEdit = false;
return view;
}
}
}

// Access the dataset:
IList dv = bizOjb[ "customers" ];
foreach ( DataRowView r in dv )
Console.WriteLine( r[ "name" ] );


上述代码中,结合了第三种方式和第四种方式,首先属性的返回值由DateView变成了IList,这样调用方只能够调用IList类型中定义的成员;其次,我们在返回IList之前,将DataView的AllowNew、AllowDelete和AllowEdit属性都设置为false,这样也能够阻止调用方对其进行改动。

总结:将引用类型通过公共接口暴露给外界,将使得类型的用户不用通过我们定义的方法和属性,就能够更改对象的内部结构,这违反了我们通常的直觉,会导致常见的错误。如果我们到处的是引用而非值,那就需要改变类型的接口,如果只是简单的返回内部数据,那么我们实际上就给外界赋予了访问内部成员的权限。客户代码可以调用成员中任何可用的方法。通过使用接口或者包装器对象向外界提供内部的私有数据,我们可以限制外界对它们的访问能力。当希望客户代码更改内部数据元素时,我们应该实现Observer模式,以使对象可以对更改进行校验或响应。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: