Ich kann keine Antwort auf die folgende Frage finden:Entkoppelt der IS-Operator den Werttyp oder nicht?
object o = 10; // Box
int i = (int)o; // Unbox
es klar ist, aber die folgende ist
bool isInt = o is int; // Is the unbox here or not?
Ich kann keine Antwort auf die folgende Frage finden:Entkoppelt der IS-Operator den Werttyp oder nicht?
object o = 10; // Box
int i = (int)o; // Unbox
es klar ist, aber die folgende ist
bool isInt = o is int; // Is the unbox here or not?
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.
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.
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.
So kann die CLR einen Typ ohne Unboxing überprüfen? –
@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. –
@JonSkeet Können Sie diesen Kommentar in die Antwort bearbeiten, ich denke, erklären * warum *, anstatt nur Beweis durch IL ist besonders wertvoll. – Servy