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

时间:2010-03-03 16:35:41

标签: .net ilist sortedlist readonly-collection

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

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

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

1 个答案:

答案 0 :(得分:3)

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

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

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

你可以看到它的引导位置,System.Collections.ObjectModel.ReadOnlyCollection可能被认为太模糊而无法包含在此列表中。可以轻松验证,你会看到当你单独使用它的方法时,你就不会进入源代码,即使你有参考源.pdbs。

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