2012-08-31 3 views

Antwort

26

Nein nicht klar, dass nicht Unboxing ist -, ob der Typ nur Giro ist richtig. Vergiss nicht, dass wirklich ein Objekt involviert ist, mit einem Typ. Die Überprüfung dieses Typs ist grundsätzlich dieselbe Operation, unabhängig davon, ob es sich bei dem Wert um einen Wert eines Boxed-Werttyps handelt oder nicht. (Es kann einige Optimierungen für Werttypen oder versiegelte Typen geben, da keine Vererbung zu berücksichtigen ist, aber im Grunde immer noch der "Typ" -Teil eines Objektkopfs.)

Eine Möglichkeit zu überprüfen, ob das kompiliert werden soll schauen sie den Code ein und an der IL mit ILASM:

// object o = 10 
IL_0000: ldc.i4.s 10 
IL_0002: box  [mscorlib]System.Int32 
IL_0007: stloc.0 

// int i = (int) o; 
IL_0008: ldloc.0 
IL_0009: unbox.any [mscorlib]System.Int32 
IL_000e: stloc.1 

// bool isInt = o is int 
IL_000f: ldloc.0 
IL_0010: isinst  [mscorlib]System.Int32 

So nutzt isinst - kein Unboxing notwendig.

+2

So kann die CLR einen Typ ohne Unboxing überprüfen? –

+3

@ViacheslavSmityukh: Ja. Vergiss nicht, dass wirklich ein Objekt involviert ist, mit einem Typ. Die Überprüfung dieses Typs ist grundsätzlich dieselbe Operation, unabhängig davon, ob es sich bei dem Wert um einen Wert eines Boxed-Werttyps handelt oder nicht. –

+2

@JonSkeet Können Sie diesen Kommentar in die Antwort bearbeiten, ich denke, erklären * warum *, anstatt nur Beweis durch IL ist besonders wertvoll. – Servy

5

Nicht nur das Unboxing ist nicht erforderlich, logisch kann es nicht.

Unboxing kann erfolgreich sein oder fehlschlagen, abhängig davon, ob das Objekt wirklich einen Wert des Typs enthält, für den wir versuchen, den Kasten zu entpacken.

Daher muss beim Unboxing überprüft werden, ob das Objekt von diesem bestimmten Typ ist.

Deshalb, wenn die Art Prüfung Unboxing erforderlich ist, dann wird, da Unboxing erfordert die Art zu testen, würden wir in der Lage zu unbox erst würden wir zuerst unboxed ...

daher eine Art Prüfung nicht benötigen, können Unboxing.

0

Ab C# 7 hat das Schlüsselwort is einen neuen Anwendungsfall erhalten, bei der Mustererkennung als Typmuster. In diesem Fall wird Unboxing auftreten z:

object o = 10; 
if (o is int i) { 
    // i is the unboxed value. 
} 

Offensichtlich ist dies ein anderer Fall auf die ursprüngliche Post, wo der Wert rein getestet wird, als wenn is als Muster verwendet, zuweisen Sie tatsächlich den Wert. Daher muss in diesem Fall die Box geöffnet werden.

Um klar zu sein - an dem ursprünglichen o is int Fall hat sich nichts geändert - es wird kein Unboxing wie in den alten Antworten vorkommen. Das Schlüsselwort is hat gerade eine neue Rolle gewonnen.

Verwandte Themen