Effective C# 学习笔记(二十六)防止返回类内部的对象引用

有些时候,你不希望你的类型的属性因为外部引用而更改状态,对外只保持只读或有限的更改权限,这时有四种方法可以防止类内部对象被外部对象引用而引起更改。

  1. 值类型
  2. 不可变类型
  3. 接口
  4. 对象封装

 

前两种只需选择正确的类型就好了,后面两种要写些代码来保证属性的访问权限。

 

使用接口实现:

记住一点,对于外界暴露类内部的属性值,要以接口的形式来暴露访问权限,而不要直接以类的形式来暴露。

例如对于拥有BindingList<T>属性的类,对外只暴露IBindingList接口的非范型属性,或者暴露ICollection<T>的范型属性。代码如下:

public class MyBusinessObject

{

// Read Only property providing access to a

// private data member:

private BindingList<ImportantData> listOfData = new BindingList<ImportantData>();

public IBindingList BindingData

{

get { return listOfData; }

}

public ICollection<ImportantData> CollectionOfData

{

get { return listOfData; }

}

// other details elided

}

 

 

使用接口和对象包装来实现只读属性的访问权限控制。代码如下:

public class MyBusinessObject

{

// Read Only property providing access to a

// private data member:

private BindingList<ImportantData> listOfData = new

BindingList<ImportantData>();

public IBindingList BindingData

{

get { return listOfData; }

}

public ReadOnlyCollection<ImportantData> CollectionOfData

{

get

{

return new ReadOnlyCollection<ImportantData>(listOfData);

}

}

// other details elided

}

 

在实现上,可以使用权限标记属性来进一步控制某一属性的访问权限。

举例来说,对于UI Control来说,其就是用 AddEdit,AllowNew,AlllowRemove等类的属性来控制外界对象对类内部的属性值的修改权限。

转载于:https://www.cnblogs.com/haokaibo/archive/2011/07/15/2107762.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值