389 Stimmen

Warum brauchen wir Boxing und Unboxing in C#?

Warum brauchen wir Boxing und Unboxing in C#?

Ich weiß, was Boxen und Unboxing ist, aber ich kann den wirklichen Nutzen nicht begreifen. Warum und wo sollte ich es verwenden?

short s = 25;

object objshort = s;  //Boxing

short anothershort = (short)objshort;  //Unboxing

0voto

Hunain Punkte 99

Im Allgemeinen sollten Sie es vermeiden, Ihre Wertetypen in Boxen unterzubringen.

Es gibt jedoch seltene Fälle, in denen dies sinnvoll ist. Wenn Sie z. B. das 1.1-Framework anvisieren müssen, haben Sie keinen Zugang zu den generischen Sammlungen. Jede Verwendung der Sammlungen in .NET 1.1 würde erfordern, dass Ihr Werttyp als System.Object behandelt wird, was zu Boxing/Unboxing führt.

Es gibt immer noch Fälle, in denen dies in .NET 2.0+ nützlich sein kann. Immer wenn Sie die Tatsache ausnutzen wollen, dass alle Typen, einschließlich Werttypen, direkt als Objekt behandelt werden können, müssen Sie möglicherweise Boxing/Unboxing verwenden. Dies kann manchmal praktisch sein, da es Ihnen erlaubt, jeden Typ in einer Sammlung zu speichern (durch die Verwendung von object anstelle von T in einer generischen Sammlung), aber im Allgemeinen ist es besser, dies zu vermeiden, da Sie die Typsicherheit verlieren. Der einzige Fall, in dem Boxing häufig vorkommt, ist die Verwendung von Reflection - viele der Aufrufe in Reflection erfordern Boxing/Unboxing bei der Arbeit mit Werttypen, da der Typ nicht im Voraus bekannt ist.

0voto

JacquesB Punkte 40790

Boxen geschieht, wenn ein Werttyp an eine Variable oder einen Parameter mit dem Typ object . Da dies automatisch geschieht, ist die Frage nicht, wann Sie Boxing verwenden sollten, sondern wann Sie den Typ object .

Der Typ object sollte nur verwendet werden, wenn es absolut notwendig ist, da es die Typsicherheit umgeht, die ansonsten ein großer Vorteil einer statisch typisierten Sprache wie C# ist. Es kann jedoch in Fällen notwendig sein, in denen es nicht möglich ist, den Typ eines Wertes zur Kompilierungszeit zu kennen.

Zum Beispiel beim Lesen eines Datenbankfeldwertes über das ADO.NET-Framework. Der zurückgegebene Wert könnte entweder ein Integer oder ein String oder etwas anderes sein, daher muss der Typ object und der Client-Code muss das entsprechende Casting durchführen. Um dieses Problem zu vermeiden, verwenden ORM-Frameworks wie Linq-to-SQL oder EF Core stattdessen statisch typisierte Entitäten, so dass die Verwendung von object vermieden wird.

Vor der Einführung von Generika wurden Sammlungen wie ArrayList hatte die Artikelarten als object . Das bedeutete, dass man alles in einer Liste speichern konnte, und dass man eine Zeichenkette zu einer Liste von Zahlen hinzufügen konnte, ohne dass das Typsystem sich beschwerte. Generics lösen dieses Problem und machen Boxing bei der Verwendung von Sammlungen von Werttypen überflüssig.

Wenn Sie also etwas eingeben wie object wird nur selten benötigt, und Sie möchten es vermeiden. Generics ist in der Regel eine bessere Lösung in Fällen, in denen der Code sowohl Werttypen als auch Referenztypen verarbeiten können muss.

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