使用ReadOnlyCollection创建只读集合

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

使用泛型创建只读集合

问题

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

解决方案

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

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>类型可以看到其中的中奖号码,从而使用户通过返回的实例来使用它。

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

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还可以象这样包装一般数组:

int [] items = new int[3];
    items[0]=0;
    items[1]=1;
    items[2]=2;
new ReadOnlyCollection<int>(items);

 

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

时间: 2024-09-21 16:31:09

使用ReadOnlyCollection创建只读集合的相关文章

WindowsServer2012VDI标准部署之创建虚拟机集合

  本篇博文来介绍如何创建虚拟机集合,在创建集合之前,我们首先需要确认要创建那一种的集合类型,在远程桌面服 务中,提供两种虚拟机集合:个人和共用.另外,根据是否自动创建和管理虚拟机来区分,又分为托管和非托管.因 此创建虚拟机集合总共有以下四种组合方式: 1.托管共用虚拟桌面集合 所谓托管,就是自动创建和管理虚拟机,所以需要准备虚拟机模板;所谓共用集合,就是当用户连接到集合时,是向 用户分配一个临时的虚拟机,所以只要空闲的虚拟机都可以被分配使用,从而达到虚拟机共用的效果. 2.托管个人虚拟桌面集合

请问C#如何创建访问集合元素的表达式?是用linq动态创建的。

问题描述 如何创建访问集合元素的表达式?是用linq动态创建的.比如Expression.Constant(3);可以创建一个常量3,用Expression.ArrayAccess可以访问数组元素.但对于集合的元素如何访问呢?比如DataTable.Rows["element1"]=1;这样的表达式该如何创建呢,谢谢 解决方案 解决方案二:用Expression.MakeIndex解决方案三:引用1楼caozhy的回复: 用Expression.MakeIndex 你好,能不能举个例子

linux中通过受限bash创建只读用户例子

受限bash 如果 bash 以 rbash 为程序名启动或者命令行参数有 -r 选项,则启动的这个 shell 会在某些功能上受限制.具体表现为如下操作都不能做: 通过 cd 来改变工作目录 设置或取消环境变量: SHELL, PATH, ENV, BASH_ENV 命令名中不能包含目录分隔符 '/' 包含有 '/' 的文件名作为内置命令 '.' 的参数 hash 内置命令有 -p 选项时的文件名参数包含 '/' 在启动时通过 shell 环境导入函数定义 在启动时通过 shell 环境解析

MongoDB 创建大量集合测试问题

问题背景 对使用 wiredtiger 引擎的 mongod 进行如下测试,不断的『创建集合.创建索引,插入一条记录』,然后统计这3个动作的耗时. var db = db.getSiblingDB("testdb"); for (var i = 0; i < 100000; i++) { var start = (new Date()).getTime(); var collName = "test" + i; var doc = {name: "n

VS2005部署:制作的安装包为什么职能创建只读文件夹?

问题描述 请教高手:用VS2005的部署模版制作安装包,其中ApplicationFolder中创建有数个文件夹,用于保存程序运行期间生成的数据文件.但是在Vista系统中安装该安装包后,安装路径下的文件夹全是只读权限的,生成的数据文件都不可见.如何用VS2005部署模版创建可读写的文件夹? 解决方案 解决方案二:应该是vista的权限问题,可能文件根本就没复制过去,所以不可见.你配置好安装用的用户权限看看.解决方案三:汗~~~楼主会不会搞错了?你手工建一个文件夹看看是不是只读的?

SQL Server 2008 数据库中创建只读用户的方法_mssql2008

在SQL Server 2008中,为了保护数据库的安全,需要给不同的使用者开通不同的访问用户,那么如何简单的控制用户的权限呢?下面我们就创建一个只读用户,给大家学习使用. SQL Server 2008 Microsoft SQLServer Management Studio 1.首先打开[Microsoft SQLServer Management Studio],用管理员账户登录.这里我选的服务器是[local],账户是[windows身份验证],如果是连接远程的服务器,输入远程服务器地

C#泛型秘诀(6)

4.9 使用泛型创建只读集合 问题 您希望类中的一个集合里的信息可以被外界访问,但不希望用户改变这个集合. 解决方案 使用ReadOnlyCollection<T>包装就很容易实现只读的集合类.例子如,Lottery类包含了中奖号码,它可以被访问,但不允许被改变: public class Lottery { // 创建一个列表. List<int> _numbers = null; public Lottery() { // 初始化内部列表 _numbers = new List

C# 3.0新特征之创建和初始化集合对象

创建|对象|集合 一. 引言 C# 3.0中新的对象初始化器是一种简单的语法特征-借助于这种特征,对象的构建和初始化变得非常简单.假定你有一个类Student,它看起来有如下样子: public class Student{ public string firstName; public string lastName;} 那么,你可以使用对象初始化器来创建这个类的一个对象,如下所示: var student1 = new Student{firstName = "Bruce", la

5.非关系型数据库(Nosql)之mongodb:创建集合,备份与导入导出, 数据还原,导入导出

 1 固定集合 固定集合值得是事先创建而且大小固定的集合 2 固定集合的特征:固定集合很像环形队列,如果空间不足,最早文档就会被删除,为新的文档腾出空间.一般来说,固定集合适用于任何想要自动淘汰过期属性的场景,没有太多的操作限制. 3 创建固定集合使用命令: db.createCollection("collectionName",{capped:true,size:100000,max:100}); size:指定集合大小,单位为KB,max指定文档的数量 当指定文档数量上限时,