请解释 C# 里 ReadOnlyDictionary 类型的用途,并说明创建该对象以及对其进行基本操作的具体步骤。
考察说明
考察对只读集合封装概念的理解以及实际API使用熟练度。
回答思路
- 【回答框架 1】ReadOnlyDictionary<TKey,TValue> 是 .NET 提供的一个只读字典包装类,它本身没有公开的构造函数,必须通过其静态方法 Create 来创建实例,该方法接收一个现有 IDictionary<TKey,TValue> 作为底层数据源。
- 【回答框架 2】创建后,ReadOnlyDictionary 只暴露读取操作,如索引器、TryGetValue、ContainsKey、Keys、Values、Count 等,任何修改操作如 Add、Remove、Clear 都会抛出 NotSupportedException。底层字典自身的修改会直接反映到只读包装上,因为包装只是一个视图。
- 【回答框架 3】使用场景主要是需要把内部可变字典安全地暴露给外部调用方,防止外部直接修改集合内容,但又不希望复制整个数据产生额外成本。
- 【回答框架 4】ReadOnlyDictionary 与 ReadOnlyCollection 类似,但针对键值对提供了键和值的只读访问。它不实现 IDictionary 接口的修改功能,只实现 IReadOnlyDictionary 接口。
- 【回答框架 5】通过 Create 方法创建后,可以正常进行遍历、查找等只读操作,适合作为只读数据契约传给只读消费方。
- 【关键点 1】ReadOnlyDictionary 是只读包装,不持有副本,底层字典变更会反映到包装上。
- 【关键点 2】创建必须用 ReadOnlyDictionary.Create 静态方法,不能直接 new。
- 【关键点 3】修改操作都会抛出 NotSupportedException。
- 【关键点 4】适用于安全暴露内部字典,避免外部修改。
- 【关键点 5】它实现 IReadOnlyDictionary<TKey,TValue>,只支持读取。
- 【易错点 1】误以为 ReadOnlyDictionary 会复制数据,导致改变底层字典后包装不更新。
- 【易错点 2】直接在包装上调用 Add 或 Remove,引发运行时异常,未提前检查 IsReadOnly 概念。
- 【易错点 3】把 ReadOnlyDictionary 看作线程安全只读集合,实际上它不保证多线程安全,底层字典若被并发修改仍有问题。