Der Implementierungsprozess von Boxing und Unboxing in .NET

高洛峰
Freigeben: 2017-01-24 14:17:33
Original
1129 Leute haben es durchsucht

Sehen Sie sich zuerst den folgenden Code an:

int tempi = 1; 
object o = tempi; 
double tempd = (double) o;
Nach dem Login kopieren

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;
Nach dem Login kopieren

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 ).

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!