Почему свойство SortedList (TKey, TValue) .Keys является IList (TKey), а не ReadOnlyCollection (TKey)? - PullRequest
3 голосов
/ 03 марта 2010

Интерфейс IList<T> включает доступ по индексу в дополнение к операциям, не поддерживаемым свойством SortedList<TKey, TValue>.Keys, таким как Add, Remove и Insert.

A ReadOnlyCollection<T>,например, возвращаемое значение List<T>.AsReadOnly, реализует IList<T> и, следовательно, предлагает доступ по индексу , но скрывает недопустимые операции, такие как Add и т. д., реализуя их явно .Кроме того, это просто оболочка для базового списка;поэтому он не создает копию и поэтому (я бы предположил) не повлиял на реальное снижение производительности.

Есть идеи, почему SortedList<TKey, TValue.Keys не является ReadOnlyCollection<TKey>?(И в этом отношении, почему свойство Values не является ReadOnlyColllection<TValue>?)

1 Ответ

3 голосов
/ 03 марта 2010

Это довольно неясно, но я думаю, что это оптимизация. Это как-то связано с тем, как реализованы дженерики. Машинный код для универсального метода класса создается во время выполнения компилятором JIT. Нужно сделать несколько конкретных версий этого. Существует один для любого ссылочного типа. И по одному для каждого аргумента типа значения, используемого в программе.

Это может быть неэффективно, потенциально много кода, который необходимо сгенерировать. Особенно плохо для базовых классов фреймворков, они Ngen-ed. Конкретная реализация метода должна быть скомпилирована JIT и не может быть в образе Ngen.

Для борьбы с этим в фреймворке есть частный код (извините, я забыл, где), который создает целый набор различных версий универсальных классов. Интересный код "ничего не делать", он довольно долго меня озадачивал. Но побочным эффектом является то, что Ngen.exe генерирует код для универсальных методов класса. Если вы теперь используете такой универсальный класс в своем собственном коде, вы получите конкретную реализацию метода из образа Ngen, компилятор JIT не нужен.

Вы можете видеть, к чему это ведет, System.Collections.ObjectModel.ReadOnlyCollection, вероятно, считался слишком неясным для включения в этот список. Легко проверяемый, вы увидите, что если вы перейдете к одному из его методов, вы не войдете в исходный код, даже если у вас есть Reference Source .pdbs.

Я не уверен на 100%, что это точное объяснение. Но обувь подходит.

...