Heim > Artikel > Backend-Entwicklung > Der Implementierungsprozess von Boxing und Unboxing in .NET
Sehen Sie sich zuerst den folgenden Code an:
int tempi = 1; object o = tempi; double tempd = (double) o;
Er kann beim Kompilieren erfolgreich sein, aber beim Ausführen wird der folgende Fehler gemeldet:
System.InvalidCastException: Die angegebene Konvertierung ist ungültig.
Das liegt daran, dass beim Entpacken eines Objekts das Ergebnis der Umwandlung sein ursprünglicher entpackter Typ sein muss. Dieser muss in den Typ „int“ konvertiert werden, bevor er in den Typ „double“ konvertiert werden kann. Das richtige Format lautet wie folgt:
int tempi = 32; object o = tempi; double tempd = (double)(int) o;
Im .NET Framework besteht das Boxen normalerweise aus den folgenden drei Schritten:
1. Reservieren Sie Speicher für das neu generierte Referenztypobjekt aus dem verwalteten Heap. Die zugewiesene Speichergröße ist die Größe der Boxed-Value-Type-Instanz selbst, plus einem Methodentabellenzeiger und einem SyncBlockIndex, der für den neu generierten Referenztyp hinzugefügt wurde.
2. Kopieren Sie die Felder der Werttypinstanz in den Speicher des neu zugewiesenen Objekts auf dem verwalteten Heap.
3. Geben Sie die Adresse des neu zugewiesenen Objekts im verwalteten Heap zurück. Auf diese Weise wird die Werttypinstanz auch zu einem Referenztypobjekt.
Der Unboxing-Vorgang läuft wie folgt ab:
1 Wenn das auszupackende Objekt null ist, wird eine NullReferenceException ausgelöst.
2. Wenn das Objekt, auf das die Referenz verweist, kein Boxed-Objekt des erwarteten Werttyps ist, schlägt das Unboxing fehl und es wird eine InvalidCastException ausgelöst (wie am Anfang dieses Artikels).
3. Ein Zeiger auf den im Box-Objekt enthaltenen Werttypteil wird zurückgegeben. Der Werttyp, auf den dieser Zeiger zeigt, weiß nichts über die zusätzlichen Mitglieder, die Referenztypobjekte normalerweise haben (z. B. einen Methodentabellenzeiger und einen SyncBlockIndex). Tatsächlich zeigt der Zeiger auf den entpackten Teil des bereits geboxten Objekts (Microsoft.NET Framework Programming a2c52a2a7d106cdf965ecfefd64f8924).
Für Punkt 3 können Sie zum besseren Verständnis das obige Beispiel verwenden. Definieren Sie zunächst die Werttypvariable tempi, die 4 Bytes im Speicher belegt. Nach dem Boxen wird sie zu einem Referenzobjekt und fügt einen Methodentabellenzeiger und einen SyncBlockIndex hinzu. Bei Referenztypen müssen Sie nur die Adresse eines „Referenztyps“ übergeben, um dessen Wert, Methodentabellenzeiger und SyncBlockIndex zu erhalten. Beim Unboxing wird die Adresse seines „Wertes“ (des entpackten Teils) übergeben, also eine Adresse (Referenz) vom Typ „int (Int32)“, die nur das Lesen von 4 Bytes zulässt. Der Double-Typ ist 8 Bytes groß, daher wird bei der impliziten Konvertierung ein Fehler gemeldet. Er muss in den Int-Typ konvertiert werden, bevor er in den Double-Typ konvertiert werden kann.
Weitere Artikel zum Implementierungsprozess von Boxing und Unboxing in .NET finden Sie auf der chinesischen PHP-Website!