3

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

A ReadOnlyCollection<T>,例如 的返回值List<T>.AsReadOnly,实现IList<T>并因此提供按索引访问,但通过显式实现它们来隐藏非法操作Add等。此外,它只是底层列表的包装器;所以它不会创建副本,因此(我会假设)不会对性能造成任何实际影响。

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

4

1 回答 1

3

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

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

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

您可以看到这会导致什么,System.Collections.ObjectModel.ReadOnlyCollection 可能被认为太晦涩而无法包含在此列表中。易于验证,您会看到,当您单步执行其方法时,即使您获得了参考源 .pdbs,您也不会单步执行源代码。

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

于 2010-03-03T18:02:21.380 回答