为什么排序列表(TKEY的,TValue).Keys属性的IList(TKEY的),而不是一个ReadOnlyCollection(TKEY的)?

StackOverflow https://stackoverflow.com/questions/2373065

IList<T>接口包括除了不是由SortedList<TKey, TValue>.Keys属性如AddRemoveInsert支持的操作由索引访问。

一个ReadOnlyCollection<T>,如List<T>.AsReadOnly的返回值,实施IList<T>,因此提供由索引的访问但像Add兽皮非法操作等通过明确地执行这些即可。此外,它仅是用于基础列表的包装;所以它不会创建一个副本,因此应(我假设),不会产生任何实际的性能影响。

任何想法,为什么SortedList<TKey, TValue.Keys不是ReadOnlyCollection<TKey>? (对于这个问题为什么Values属性不是ReadOnlyColllection<TValue>?)

有帮助吗?

解决方案

这是相当模糊的,但我认为这是一种优化。它是与泛型的实现方式。用于通用类方法的机器代码在运行时由JIT编译器创建的。它需要做的是一些具体的版本。有一个用于任何引用类型。和每一个对于在一个程序中使用的每个单个值类型参数。

这可能是低效的,潜在地大量的代码,要产生的需要。特别是对于通用框架类的坏,他们是NGEN-ED。具体方法实现将必须是JIT编译和不可能是NGEN图像英寸

要打击的是,有一个在框架(对不起,我忘了在哪里),实例化泛型类的各种版本的整体筏专用代码。有趣的什么也不做的代码,它困扰了我很长一段时间。但副作用是Ngen.exe为通用类的方法生成代码。如果你现在在自己的代码中使用这样的通用类,你会得到从NGEN图像的方法的具体实现,不需要JIT编译器。

您可以看到该线索,System.Collections.ObjectModel.ReadOnlyCollection大概认为太晦涩获得包括在此名单。容易核查,你会看到,当你单步进入一个如果它的方法,你会不会步到源代码,即使你得到了参考源.pdbs。

我不是100%肯定这是确切的解释。但鞋合

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top