Wie wirken sich generische C # -Auflistungen auf Sammlungen mit Grundelementen aus?

8

Wie ich es verstehe, unterstützen C # /. Net Generika ein gewisses Maß an Verdinglichung. Also, wenn ich den folgenden Code habe:

%Vor%

Wird der Wert 1 autoboxiert oder behandelt das Objekt 'list' primitive Zeichenfolgen effizient?

    
Michael Barker 18.09.2010, 10:39
quelle

4 Antworten

18

Nein, es wird nicht eingerahmt. Zur Ausführungszeit ist das Hintergrund-Array für List<int> wirklich ein int[] . Beachten Sie, dass dies nicht nur bei echten primitiven Typen der Fall ist - List<T> wird keine Werte von beliebigen -Werttypen packen (vorausgesetzt, es wurde als List<Guid> etc und nicht als List<object> deklariert).

Im Allgemeinen behalten Generika in .NET viel mehr ihrer Informationen bei als in Java - die CLR versteht nativ Generika und behandelt sie entsprechend, anstatt in Java, wo die JVM sie ziemlich ignoriert.

>

Zum Beispiel, wenn Sie schreiben:

%Vor%

Dann ist type gleich typeof(List<string>) - was dann anders ist als (sagen wir) List<Guid> etc.

    
Jon Skeet 18.09.2010, 10:41
quelle
5

Die int -Werte werden nicht in der Liste eingerahmt. Dies ist eine der Schönheiten bei Generics, dass der Compiler (genauer gesagt der JIT-Compiler, glaube ich) eine typisierte Version der Klasse List<> erstellt, anstatt die Werte als% co_de zu speichern %. Es erzwingt nicht nur Typsicherheit durch die offengelegten Methoden und Eigenschaften, sondern es wird in allen Aspekten wirklich getippt.

    
Fredrik Mörk 18.09.2010 10:42
quelle
5

Wie bereits erwähnt, erzeugt der Jitter neuen Code für jede Konstruktion mit einem neuen Werttyp. Ein interessanter Punkt, der bisher noch nicht erwähnt wurde, ist, dass der Jitter Code einmal für eine Referenztypkonstruktion erzeugt und diesen für jeden Referenztyp wiederverwendet. Der Code für List<object> entspricht genau dem Code für List<string> .

Das mag verrückt klingen, aber denken Sie daran, Generika sind keine Vorlagen. Zu dem Zeitpunkt, zu dem der Code für den generischen Methodenkörper IL ausgegeben wird, wird die Überladungsauflösung und andere relevante semantische Analyse bereits durch den C # -Compiler erledigt .

    
Eric Lippert 18.09.2010 14:17
quelle
3

.NET-Generics werden speziell für Strukturen entwickelt, daher ist in Ihrem Fall kein Boxen erforderlich. Beachten Sie, dass das Gießen auch nicht notwendig ist.

    
Dario 18.09.2010 10:41
quelle

Tags und Links