5 Stimmen

Boxing & Unboxing

var i = new int[2];

Wird "i" als geboxed betrachtet?

9voto

kemiller2002 Punkte 110605

Nein, es gibt nichts, was verboxt wird. Das Schlüsselwort var bedeutet nicht, dass die Variable verboxt ist. Es erfolgt keine Konvertierung während der Laufzeit. Das Schlüsselwort var ist streng genommen eine C#-Konstruktion. Was tatsächlich passiert, wenn du var verwendest, ist:

var i = new int[1];

IL sieht es als:

int[] i = new int[1]

Jetzt, wenn du fragst, ob beim Zuweisen einer Integer-Zahl zu einem Teil des Arrays von i verboxt wird:

zum Beispiel:

i[0] = 2;

Nein, das passiert nicht.

Dies steht im Gegensatz zu folgendem:

var o = new object[1];

o[0] = 2;

In diesem Beispiel geschieht es und deshalb war der Einsatz von ArrayList (denke an ein erweiterbares Array) in 1.0, 1.1 (vor Generics) sehr kostspielig. Der folgende Kommentar gilt auch für das Beispiel mit object[]:

Jeder Referenz- oder Werttyp, der zu einem ArrayList hinzugefügt wird, wird implizit zu Object hochgestuft. Wenn die Elemente Werttypen sind, müssen sie beim Hinzufügen zur Liste verboxt und beim Abrufen ausgepackt werden. Sowohl die Umwandlung als auch die Box- und Unbox-Vorgänge beeinträchtigen die Leistung; die Auswirkungen von Boxing und Unboxing können in Szenarien, in denen über große Sammlungen iteriert werden muss, ziemlich signifikant sein.

MSDN-Link zu ArrayList

Link zu Boxing in C#

7voto

Matti Virkkunen Punkte 61148

Unter der Annahme, dass dies C# ist (var und C#-ähnliche Array-Syntax), nein, i wird nicht geboxed. Nur primitive Werttypen (z. B. numerische Werte) können geboxed werden.

Die Werte im Array sind ebenfalls nicht geboxed, da Werte in primitiven Arrays nicht geboxed werden.

4voto

RaYell Punkte 67866

Array in C# ist ein Referenztyp, daher ist kein Boxen erforderlich. Sie werden jedoch ein Boxing in diesem Beispiel haben:

 var i = 123;
object o = i;

3voto

Thorarin Punkte 45433

Boxen tritt nur auf, wenn ein Werttyp (d. h. ein primitiver Typ, eine Struktur oder eine Aufzählung) als Verweistyp behandelt wird. Ihr Array ist so deklariert, dass es Werte des Typs int enthält. Das var Schlüsselwort sagt dem Compiler lediglich, den Typ der Variable i zu inferieren, anstatt dass Sie ihn manuell angeben müssen.

Wenn Sie geschrieben hätten:

var i = new object[2];

Würde der Compiler das zu object[] i = new object[2] übersetzen, und alle int Werte, die Sie dort hineinsetzen, würden geboxt werden. Jeder Verweistyp, den Sie in das gleiche Array setzen, würde keine Boxen benötigen.

Kurz gesagt hat var nichts mit Boxen zu tun.

Hier ist ein Diagramm verschiedener Typen in .NET. Sie möchten vielleicht auch .NET Typgrundlagen lesen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X