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

请说明在 C# 中,ReadOnlyObservableCollection<T> 的用途是什么,并解释它与 ObservableCollection<T> 的主要区别。

技术原理方案权衡C#

考察说明

考查对只读集合包装类在可观察性场景下的设计意图和特点的理解。

回答思路

  1. 【回答框架 1】ReadOnlyObservableCollection<T> 是 .NET 中用于提供只读视图的集合类,它包装一个 ObservableCollection<T>,阻止调用方通过该视图修改集合,同时将内部的集合变更事件转发给外部监听者。
  2. 【回答框架 2】它实现 INotifyCollectionChanged 和 INotifyPropertyChanged 接口,因此当内部集合添加、移除或重置时,外部绑定或订阅者能收到通知。常见用途是在 MVVM 中向 UI 暴露只读列表,防止外部误改,同时保持数据变更的实时反馈。
  3. 【回答框架 3】与直接暴露 ObservableCollection<T> 相比,主要区别在于写权限:前者禁止从该引用添加、删除或清空元素,而后者允许。但注意,ReadOnlyObservableCollection<T> 只是包装引用,若内部集合本身被修改,视图仍会反映变化。
  4. 【回答框架 4】若需要完全不可变的列表,应使用 ReadOnlyCollection<T> 或 ImmutableArray<T>,但这类集合不提供变更通知,适合数据固定不变的场景。选择时需权衡只读需求和动态更新需求。
  5. 【关键点 1】ReadOnlyObservableCollection<T> 提供只读包装,阻止外部修改集合。
  6. 【关键点 2】它实现 INotifyCollectionChanged,内部集合变化时向外部发送通知。
  7. 【关键点 3】适用于 MVVM 中对外暴露只读列表,同时保持更新能力。
  8. 【关键点 4】与 ReadOnlyCollection<T> 不同,它保留可观察性。
  9. 【易错点 1】不要认为 ReadOnlyObservableCollection<T> 保证集合内容永不改变,它只是阻止外部直接修改。
  10. 【易错点 2】不要混淆它与 ReadOnlyCollection<T>,后者不提供变更通知。