.net - 为什么 SortedList(TKey,TValue).Keys 属性是 IList(TKey) 而不是 ReadOnlyCollection(TKey)?

标签 .net ilist sortedlist readonly-collection

IList<T>除了 SortedList<TKey, TValue>.Keys 不支持的操作外,接口(interface)还包括按索引访问属性如 Add , Remove , 和 Insert .

A ReadOnlyCollection<T> ,比如List<T>.AsReadOnly的返回值, 工具 IList<T>因此提供索引访问但隐藏非法操作如Add等,通过明确实现它们。此外,它只是底层列表的包装器;所以它不会创建副本,因此(我认为)应该不会产生任何实际的性能损失。

知道为什么 SortedList<TKey, TValue.Keys不是 ReadOnlyCollection<TKey> ? (就此而言,为什么 Values 属性不是 ReadOnlyColllection<TValue> ?)

最佳答案

这很晦涩,但我认为这是一种优化。它与泛型的实现方式有关。通用类方法的机器代码由 JIT 编译器在运行时创建。它需要制作它的几个具体版本。任何引用类型都有一个。程序中使用的每个值类型参数都对应一个。

这可能效率低下,可能需要生成大量代码。对于通用框架类尤其不利,它们是 Ngen-ed 的。具体的方法实现必须是JIT编译的,不能在Ngen镜像中。

为了解决这个问题,框架中有私有(private)代码(抱歉,我忘了在哪里),它实例化了一大堆不同版本的通用类。有趣的无所事事的代码,让我困惑了好一阵子。但副作用是 Ngen.exe 会为泛型类方法生成代码。如果您现在在自己的代码中使用这样一个泛型类,您将从 Ngen 镜像中获得该方法的具体实现,不需要 JIT 编译器。

您可以看到它的导向,System.Collections.ObjectModel.ReadOnlyCollection 可能被认为太晦涩而无法包含在此列表中。易于验证,您会发现,当您单步执行其中一个方法时,您将不会执行源代码,即使您获得了引用源 .pdbs。

我不是 100% 确定这是准确的解释。但是鞋子合脚。

关于.net - 为什么 SortedList(TKey,TValue).Keys 属性是 IList(TKey) 而不是 ReadOnlyCollection(TKey)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2373065/

相关文章:

c# - AddDbContext 在 .NET Core 的 IServiceCollection 中不可用

c# - 将绑定(bind)源数据源设置为通用 IList<> 错误

c# - 从接口(interface)继承的类中的列表 - 从类中添加到列表?

c# - Mono 中的 IEnumerable 接口(interface)和 Skip 方法

java - 将 3 个链表合并为 1 个(Java)

listview - JavaFX 排序 ListView

c# - .NET 服务器调度服务 - 我应该如何处理这个问题?

c# - C# 中的 Catch 和 Catch(异常 e)

.net - MSBuild (TFS) 中的 Nhibernate.Bytecode.CaSTLe 问题

c# - 为什么 C# .NET SortedList<T1, T2> 实际上没有 ElementAt?