Pourquoi le SortedList (TKey, TValue) .keys propriété IList (TKey) plutôt que d'un ReadOnlyCollection (TKey)?

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

Question

L'interface IList<T> comprend l'accès par index en plus des opérations ne sont pas supportées par la propriété SortedList<TKey, TValue>.Keys tels que Add, Remove et Insert.

A ReadOnlyCollection<T>, comme la valeur de retour de List<T>.AsReadOnly, met en œuvre IList<T> et offre donc un accès par index mais cache des opérations illégales comme Add, etc. en les appliquant explicitement . En outre, il est simplement une enveloppe pour la liste sous-jacente; il ne crée pas une copie et devrait donc (je suppose) ne contractera aucune véritable succès de la performance.

Toute idée pourquoi SortedList<TKey, TValue.Keys est pas un ReadOnlyCollection<TKey>? (Et d'ailleurs pourquoi la propriété Values est pas ReadOnlyColllection<TValue>?)

Était-ce utile?

La solution

est assez obscure, mais je pense que cela est une optimisation. Il a quelque chose à voir avec les génériques moyen sont mis en œuvre. Le code de la machine pour une méthode de classe générique est créée lors de l'exécution par le compilateur JIT. Il doit faire plusieurs versions concrètes de celui-ci. Il y a un pour tout type de référence. Et un pour tous les arguments de type valeur unique qui est utilisé dans un programme.

Cela peut être inefficace, potentiellement beaucoup de code qui doit être généré. Surtout mauvais pour les classes cadres génériques, ils sont Ngen-ed. La mise en œuvre de la méthode concrète devrait être JIT compilé et ne pouvait pas être à l'image Ngen.

Pour lutter contre cela, il y a un code privé dans le cadre (désolé, j'ai oublié où), qui instancie toute une série de différentes versions de classes génériques. Intéressant Code do-rien, il m'a laissé perplexe pendant un certain temps. Mais l'effet secondaire est que Ngen.exe génère du code pour les méthodes de classe génériques. Si vous utilisez maintenant une telle classe générique dans votre propre code, vous obtiendrez la mise en œuvre concrète de la méthode de l'image Ngen, le compilateur JIT n'est pas nécessaire.

Vous pouvez voir où cela mène, System.Collections.ObjectModel.ReadOnlyCollection a probablement été jugée trop obscure pour s'inclus dans cette liste. Facilement vérifiables, vous verrez que lorsque vous seule étape dans l'une de ses méthodes, vous ne serez pas entrer dans le code source, même si vous avez la .pdbs Source de référence.

Je ne suis pas 100% sûr que ce soit l'explication exacte. Mais la chaussure convient.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top