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?
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.
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.
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 .
Tags und Links .net c# generics reification