ReadOnlyDictionary之应用场景

本文地址:http://www.cnblogs.com/AndersLiu/archive/2009/04/17/usage-of-readonly-dictionary.html

作者:Anders Liu

前两天发布了《隐藏接口实现 及 ReadOnlyDictionary》一文,有不少朋友提出疑问。其中一个主要问题就是,这样做真的可以实现“只读”吗?如果还有其他变量引用了ReadOnlyDictionary所包装的普通字典,依然可以通过另外这个变量来修改字典中的内容。有朋友甚至提到了,可以在创建ReadOnlyDictionary时,将原有字典中的内容复制出一份,来做到真正的“只读”。

其实,这些主要是因为我对这个类的应用场景没有介绍清楚的缘故。其实我这里提到的ReadOnlyDictionary也好,.NET提供的ReadOnlyCollection也罢,其目的并不是让整个字典(或集合)真的“只读”,而是希望某些具有字典(或集合)性质类成员,能够做到“在当前类中可读写,在类的外部只读”。

考虑这样一个场景,我要实现一个FileStructure类,表示文件结构,其中包含了多个Field。每个FileStructure里的每个Field都具有不同的名字,我希望用户能够用名字检索到对应的字段,所以最好的方式是将字段保存在一个字典中。

public class FileStructure
{public Dictionary<string, Field> Fields{get { return _fields; }}public FileStructure(){_fields = new Dictionary<string, Field>();_fields.Add("DosHeader", new Field(...));_fields.Add("PEHeader", new Field(...));_fields.Add("OptionalHeader", new Field(...));}private Dictionary<string, Field> _fields;
}

上面的代码虽然保证了Fields属性是只读的——可以确保用户无法用自己的字典实例来替换FileStructure所有的——但却不能防止用户自己向Fields属性中添加其他字段。

如果使用ReadOnlyDictionary,就能很好地避免这一问题。

public class FileStructure
{public ReadOnlyDictionary<string, Field> Fields  // Change ‘Dictionary’ to ‘ReadOnlyDictionary’{get { return _roFields; }  // Change '_fields' to '_roFields'}public FileStructure(){_fields = new Dictionary<string, Field>();_roFields = new ReadOnlyDictionary<string, Field>(_fields);  // Added_fields.Add("DosHeader", new Field(...));_fields.Add("PEHeader", new Field(...));_fields.Add("OptionalHeader", new Field(...));}private Dictionary<string, Field> _fields;private ReadOnlyDictionary<string, Field> _roFields;  // Added
}

现在,就不怕用户“擅自”修改字典中的内容了。

在ReadOnlyDictionary的实现中,并没有复制所包装的字典中的内容。这样做的好处是显而易见的——其一,节省空间。其二,ReadOnlyDictionary能够及时反映内部普通字典上发生的变化;也就是说,如果在类的“内部”向字典中添加了新值,或修改了某些条目,则在类的“外部”可以从之前拿到的只读字典中,访问到这些变化过的条目。

链接:

  • 访问《隐藏接口实现 及 ReadOnlyDictionary》——http://www.cnblogs.com/AndersLiu/archive/2009/04/16/hide-interface-member-and-readonly-dictionary.html
  • 下载ReadOnlyDictionary——http://files.cnblogs.com/AndersLiu/ReadOnlyDirectionary.zip

(完)

转载于:https://www.cnblogs.com/AndersLiu/archive/2009/04/17/usage-of-readonly-dictionary.html

ReadOnlyDictionary之应用场景相关推荐

  1. @Transactional注解最容易忽视的三个失效场景!

    @Transactional注解在以下场景中使用,是会失效的,切记! 1.非public方法 spring对注解事务的方法进行校验,修饰符是不是public,不是 public则不会获取@Transa ...

  2. 2022-2028年中国场景金融行业深度调研及投资前景预测报告

    [报告类型]产业研究 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了场景金融行业相关概述.中国场景金融行业运行环境.分析了中国场景金融行 ...

  3. mysql mgr应用场景_悄悄告诉你 MySQL MGR 牛在哪?

    大家听过 MySQL MGR 技术吗? MySQL 是目前最流行的开源关系型数据库,国内金融行业也开始全面使用,其中MySQL 5.7.17 提出的 MGR(MySQL Group Replicati ...

  4. Python 闭包、单个装饰器、多个装饰器、装饰器修饰类、应用场景

    1. 闭包 在 Python 中,函数也可以作为参数.我们可以执行下面的代码: def func(a, b):return a + bprint(func) 我们直接输出函数名,而没有加括号.输出结果 ...

  5. etcd 笔记(01)— etcd 简介、特点、应用场景、常用术语、分布式 CAP 理论、分布式原理

    1. etcd 简介 etcd 官网定义: A highly-available key value store for shared configuration and service discov ...

  6. 机器学习——标准化/归一化的目的、作用和场景

    对每个特征进行归一化处理,使得每个特征的取值缩放到0~1之间.这样做有两个好处: 模型训练更高效. 特征前的权重大小可代表该变量对预测结果的贡献度(因为每个特征值本身的范围相同). (一)归一化的作用 ...

  7. 2022年AI芯片场景

    2022年AI芯片场景 随着技术成熟化,AI芯片的应用场景除了在云端及大数据中心,也会随着算力逐渐向边缘端移动,部署于智能家居.智能制造.智慧金融等领 域:同时还将随着智能产品种类日渐丰富,部署于智能 ...

  8. HiCar人-车-家全场景智慧互联

    HiCar人-车-家全场景智慧互联 (HUAWEI HiCar Smart Connection)解决方案,具备如下特点: • 安全交互:以安全为前提的极简交互(Safety) • 无感互联:手机/I ...

  9. 拥挤场景中的目标检测

    拥挤场景中的目标检测 Detection in Crowded Scenes: One Proposal, Multiple Predictions 论文链接: https://arxiv.org/a ...

最新文章

  1. win10 +python 3.6.4安装scrapy
  2. R语言 (温度 随时间变化)
  3. php-fpm 启动参数及重要配置详解
  4. delete []实现机制
  5. python自动排版 html_Python 实现自动完成A4标签排版打印功能
  6. JavaScript --- [学习笔记]观察者模式 理解对象 工厂模式 构造函数模式
  7. Docker本地私有仓库的建立
  8. 集成学习框架-学习小结20161121
  9. 【20211005】Praat 基本用法
  10. linux配置web页面登录密码,在Linux下通过WEB认证方式上网
  11. 每月缴的个税,你知道怎么算的吗?
  12. 【论文泛读95】一石二鸟:窃取模型并从基于BERT的API推断属性
  13. java word转pdf在linux系统上可行
  14. [创业-33]:股权、期权、期股的区别
  15. 苹果xsmax怎么开机_粉丝水洗苹果XS MAX手机不开机,Face ID报废,你还这么做吗?...
  16. RocketMQ(九)RocketMQ顺序消息
  17. 智慧城市,是城市建设者做的最灿烂的事
  18. Zotero(1)---文献管理软件Zotero安装教程
  19. 常用dos命令(4)
  20. DSP CCS12.00 芯片:TMS320F28335 TFTLCD显示屏幕的应用

热门文章

  1. struts Caused by: no protocol dtd - Class: java.net.URL
  2. Eclipse+Maven创建webapp项目二 (转)
  3. 1089 狼人杀-简单版 (20分)
  4. 问题 J: 输出是m的倍数或n的倍数、但不是m和n的公倍数的数
  5. python决策树分类 导入数据集_BPNN、决策树、KNN、SVM分类鸢尾花数据集Python实现...
  6. 自用_C/C++报错记录汇总
  7. MEME将于4月12日推出V2版本
  8. 杭州滨江工作方案:将区块链等产业与“数字滨江”、“数字经济”紧密相连
  9. MMO游戏War Riders宣布将于基于区块链的游戏开发公司Immutable集成
  10. 数据:灰度比特币信托基金溢价达41%创近一年新高