C#面试题更新 2026-08-03

请解释 C# 里 ReadOnlyDictionary 类型的用途,并说明创建该对象以及对其进行基本操作的具体步骤。

考察说明

考察对只读集合封装概念的理解以及实际API使用熟练度。

回答思路

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