您的位置:首页 > 其它

引用类型作为属性返回需谨慎

2016-03-07 08:23 344 查看
代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;
namespace ConsoleApplication2
{
public class ReferenceTypeAttributeList
{
private List<string> strList = new List<string>();
public ReferenceTypeAttributeList()
{
for (int i = 0; i < 10; i++)
{
strList.Add("string" + i);
}
}
public List<string> StrList
{
get
{
return strList;
}
}
}
}


上面代码用来模拟返回引用类型的属性。虽然这个属性是只读属性,但是如果外部调用获取到对应的列表,还是可以更改List这个大的集合,因为IList接口提供的Add(),Clear()方法出卖了这个只读属性。如下code就可以修改集合的值:

static void Main(string[] args)
{
ReferenceTypeAttributeList rtal=new ReferenceTypeAttributeList();
List<string> strList = rtal.StrList;
strList.Add("string11");//可以修改只读集合
strList[0]="string12";//修改第一个元素为string12
strList = rtal.StrList;//里面有11个元素且第一个元素为string12
strList.Clear();//可以修改只读集合
strList = rtal.StrList;//Clear()方法执行之后,此时集合变为空了。
}


如果系统变量或者其它重要的参数使用引用类型作为属性返回,这个时候必须使用真正的只读属性,而微软给我们提供了一种只读属性如下:

public ReadOnlyCollection<string> StrList
{
get
{
return new ReadOnlyCollection<string>(strList);
}
}


此时返回的字符集合就只能进行读取而无法进行修改

ReadOnlyCollection<string> strList = rtal.StrList3;
strList.Add("string11");//无效代码
strList.Clear();//无效代码
strList[0] = "string12";//无效代码


当然还用一种自己写的代码,就是重新返回一个新的对象。格式如下:

```
public List<string> StrList
{
get
{
return new List<string>(strList);
}
}

List<string> strList = rtal.StrList;
strList.Add("string11");//此时添加到新的对象集合里面
strList[0] = "string12";//此时修改的为新的对象集合里面第一个元素为string12
strList = rtal.StrList;//里面有10个元素且还是原来的集合
strList.Clear();//清空
strList = rtal.StrList;//Clear()方法执行之后,再次获取集
```合还是原来的集合。


这种情况虽然能修改和情况,但是只是针对新的集合,不会修改原来的集合。也算是一种假象的只读集合。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: