Warum ist die SortedList (TKey, TValue) .Keys Eigenschaft eine IList (TKey) eher als ein Readonlycollection (TKey)?

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

Frage

Die IList<T> Schnittstelle umfasst den Zugriff durch den Index zusätzlich zu Operationen nicht von der SortedList<TKey, TValue>.Keys Eigenschaft unterstützt wie Add, Remove und Insert.

Ein ReadOnlyCollection<T>, wie der Rückgabewert von List<T>.AsReadOnly, implementiert IList<T> und damit Zugang Angebote von Index aber versteckt illegale Operationen wie Add usw., indem sie ausdrücklich die Umsetzung . Darüber hinaus ist es nur ein Wrapper für die zugrunde liegende Liste; so dass es nicht eine Kopie erstellen und daher soll (ich nehme würde) nicht entsteht keine wirklichen Performance-Einbußen.

Jede Idee, warum SortedList<TKey, TValue.Keys kein ReadOnlyCollection<TKey> ist? (Und was das betrifft, warum die Values Eigenschaft ist kein ReadOnlyColllection<TValue>?)

War es hilfreich?

Lösung

Das ist ziemlich dunkel, aber ich denke, dies ist eine Optimierung ist. Es hat etwas mit der Art und Weise Generika umgesetzt werden zu tun. Der Maschinencode für eine allgemeine Klasse Methode wird zur Laufzeit durch den JIT-Compiler erstellt. Es muss mehr konkreten Versionen davon machen. Es gibt einen für jeden Referenztyp. Und je eines für jedes einzelnen Werttyp Argument, das in einem Programm verwendet wird.

Das kann ineffizient sein, potentiell viel Code, dass der Bedarf erzeugt werden. Besonders schlecht zu generisches Framework-Klassen, sind sie Ngen-ed. Die konkrete Methode Implementierung würde kompiliert werden muß JIT und nicht im Ngen Bild sein könnte.

Um das zu bekämpfen, gibt es privaten Code im Rahmen (sorry, ich habe vergessen, wo), die eine ganze Reihe von verschiedenen Versionen von generischen Klassen instanziiert. Interessanter do-nothing-Code, es verwirrte mich für eine ganze Weile. Aber der Nebeneffekt ist, dass Ngen.exe Code für die generische Klasse Methoden erzeugt. Wenn Sie nun eine solche generische Klasse in Ihrem eigenen Code verwenden, werden Sie die konkrete Umsetzung des Verfahrens aus dem Ngen Bild erhalten, wird der JIT-Compiler nicht benötigt wird.

Sie sehen, wohin das führt, wurde System.Collections.ObjectModel.ReadOnlyCollection wahrscheinlich in dieser Liste aufgenommen zu verschleiern als zu bekommen. Leicht überprüfbar, werden Sie sehen, dass, wenn Sie Schritt in eine, wenn seine Methoden, werden Sie nicht Schritt in den Quellcode, auch wenn Sie die Referenzquelle .pdbs bekam.

Ich bin nicht 100% sicher, dass dies die genaue Erklärung. Aber der Schuh passt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top