前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用ReadOnlyCollection创建只读集合

使用ReadOnlyCollection创建只读集合

作者头像
跟着阿笨一起玩NET
发布2018-09-19 16:50:00
1.4K0
发布2018-09-19 16:50:00
举报

转载:http://www.cnblogs.com/abatei/archive/2008/02/04/1064102.html

使用泛型创建只读集合

问题

您希望类中的一个集合里的信息可以被外界访问,但不希望用户改变这个集合。

解决方案

使用ReadOnlyCollection<T>包装就很容易实现只读的集合类。例子如,Lottery类包含了中奖号码,它可以被访问,但不允许被改变:

代码语言:javascript
复制
public class Lottery
    {
        // 创建一个列表.
        List<int> _numbers = null;
        public Lottery()
        {
            // 初始化内部列表
            _numbers = new List<int>(5);
            // 添加值
            _numbers.Add(17);
            _numbers.Add(21);
            _numbers.Add(32);
            _numbers.Add(44);
            _numbers.Add(58);
        }
        public ReadOnlyCollection<int> Results
        {
            // 返回一份包装后的结果
            get { return new ReadOnlyCollection<int>(_numbers); }
        }
}

Lottery有一个内部的List<int>,它包含了在构造方法中被填的中奖号码。有趣的部分是它有一个公有属性叫Results,通过返回的ReadOnlyCollection<int>类型可以看到其中的中奖号码,从而使用户通过返回的实例来使用它。

如果用户试图设置集合中的一个值,将引发一个编译错误:

代码语言:javascript
复制
Lottery tryYourLuck = new Lottery();
    // 打印结果.
    for (int i = 0; i < tryYourLuck.Results.Count; i++)
    {
        Console.WriteLine("Lottery Number " + i + " is " + tryYourLuck.Results[i]); 
    }
    // 改变中奖号码!
    tryYourLuck.Results[0]=29;
    //最后一行引发错误:// Error 26 // Property or indexer
    // 'System.Collections.ObjectModel.ReadOnlyCollection<int>.this[int]'
    // cannot be assigned to -- it is read only

讨论

ReadOnlyCollection的主要优势是使用上的灵活性,可以在任何支持IList或IList<T>的集合中把它做为接口使用。ReadOnlyCollection还可以象这样包装一般数组:

代码语言:javascript
复制
int [] items = new int[3];
    items[0]=0;
    items[1]=1;
    items[2]=2;
new ReadOnlyCollection<int>(items);

这为类的只读属性的标准化提供了一种方法,并使得类库使用人员习惯于这种简单的只读属性返回类型。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-01-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档