引用类型作为属性返回需谨慎
2016-03-07 08:23
344 查看
代码如下:
上面代码用来模拟返回引用类型的属性。虽然这个属性是只读属性,但是如果外部调用获取到对应的列表,还是可以更改List这个大的集合,因为IList接口提供的Add(),Clear()方法出卖了这个只读属性。如下code就可以修改集合的值:
如果系统变量或者其它重要的参数使用引用类型作为属性返回,这个时候必须使用真正的只读属性,而微软给我们提供了一种只读属性如下:
此时返回的字符集合就只能进行读取而无法进行修改
当然还用一种自己写的代码,就是重新返回一个新的对象。格式如下:
这种情况虽然能修改和情况,但是只是针对新的集合,不会修改原来的集合。也算是一种假象的只读集合。
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()方法执行之后,再次获取集 ```合还是原来的集合。
这种情况虽然能修改和情况,但是只是针对新的集合,不会修改原来的集合。也算是一种假象的只读集合。
相关文章推荐
- 集成禅道和svn
- Systemd 对垒 Docker
- Systemd 对垒 Docker
- chattr 与 lsattr 命令详解
- HUST 1599 Multiple
- UESTC - 1252 24点游戏 (DFS)好题
- HDU 3903 Trigonometric Function
- 四:java中传统线程同步与通信
- svn中的Trunk,branches,tags深度理解
- HUST 1605 Gene recombination
- CUGBACM_Summer_Tranning 组队赛解题报告
- 修饰
- 从零开始学Android(一):Android开发环境的搭建及项目目录结构的分析
- lintcode-easy-Subtree
- 命名规范,编码规则(Android版)
- centos jdk 下载
- 开学了
- 创建滚动进度条的几种方法
- 【poj3281】Dining 最大流
- cloud-init源代码目录简介