IList<T>
接口除了SortedList<TKey, TValue>.Keys
属性不支持的操作外,还包括索引访问,例如Add
,Remove
和Insert
。< / p>
ReadOnlyCollection<T>
,例如List<T>.AsReadOnly
的返回值,会实现IList<T>
,因此可以通过索引提供访问权限,但会隐藏Add
等非法操作。明确地实施它们。此外,它只是底层列表的包装器;因此它不会创建副本,因此(我认为)不会产生任何真正的性能损失。
知道为什么SortedList<TKey, TValue.Keys
不是ReadOnlyCollection<TKey>
? (为此,为什么Values
属性不是ReadOnlyColllection<TValue>
?)
答案 0 :(得分:3)
这很模糊,但我认为这是一种优化。它与泛型的实现方式有关。通用类方法的机器代码由JIT编译器在运行时创建。它需要制作几个具体版本。任何参考类型都有一个。并且对于程序中使用的每个值类型参数都是一个。
这可能效率低下,可能需要生成大量代码。对于通用框架类尤其糟糕,它们是Ngen-ed。具体的方法实现必须是JIT编译的,不能在Ngen映像中。
为了解决这个问题,框架中有私有代码(抱歉,我忘了哪里),它实例化了大量不同版本的泛型类。有趣的无所事事的代码,它困扰了我很长一段时间。但副作用是Ngen.exe为泛型类方法生成代码。如果您现在在自己的代码中使用这样的泛型类,您将从Ngen映像中获得该方法的具体实现,不需要JIT编译器。
你可以看到它的引导位置,System.Collections.ObjectModel.ReadOnlyCollection可能被认为太模糊而无法包含在此列表中。可以轻松验证,你会看到当你单独使用它的方法时,你就不会进入源代码,即使你有参考源.pdbs。
我不是100%确定这是确切的解释。但鞋子适合。