Instanziieren „AS“ Stichwort
Frage
Ich habe vor kurzem angefangen habe die Arbeit mit JSON und dem ExtJs Rahmen und ich habe über den folgenden Code in einem Beispiel kommen.
Wir rufen Sie die Informationen aus dem Frontend mit diesem:
object updatedConfig = JavaScriptConvert.DeserializeObject(Request["dataForm"]);
Dann in dem Beispiel, das sie wie folgt vor:
JavaScriptObject jsObj = updatedConfig as JavaScriptObject;
Ich habe noch nie das „als“ Schlüsselwort wie die zuvor verwendet gesehen. Ist das nur eine andere Form der explizit die updatedConfig Variable als JavaScriptObject Boxen oder ist es etwas, was ich nicht über dieses Verständnis?
Danke
Lösung
Dies wird als sichere Besetzung bekannt. Was ist tut, ist es versucht, von einem Typ zum anderen zu werfen und wenn die Besetzung null
es gibt nicht stattdessen eine InvalidCastException
werfen.
Es gibt tatsächlich zwei getrennte IL Anweisungen, um den Unterschied zwischen „as
“ Gießen und normalen statischem Gießen zu behandeln. Der folgende C # -Code enthält beide Arten von Casting:
using System;
class Program
{
static void Main()
{
Object o = null;
String s0 = (String)o;
String s1 = o as String;
}
}
Der erste Guss verwendet die castclass
IL Anweisung und die zweite gegossene verwendet die isinst
Anweisung.
Bitte finden Sie unter Casting vs mit dem 'wie' Schlüsselwort in die CLR für eine ausführlichere Erklärung.
Andere Tipps
Die als Schlüsselwort ist ein sicherer Art und Weise Objekte in C # zu werfen.
SomeType a = obj as SomeType;
bedeutet, dass wenn obj
vom Typ SomeType
ist, wird obj
in dieser Art gegossen werden. Wenn obj
null ist oder nicht vom Typ SomeType
, wird eine Null sein.
Ein weiterer Vorteil der als Schlüsselwort ist, dass es eine Kompilierung Ausnahme ausgelöst wird, wenn der Typ nicht gegossen werden kann, wo, wie (cast) bricht nicht erst zur Laufzeit.
Außerdem ist es wichtig, sich daran zu erinnern, dass „als“ in der Referenz arbeitet nicht im Objekt selbst. Deshalb ist es null statt wirft eine Ausnahme zurückkehren kann, weil das Objekt intakt bleiben. Und das ist, warum Sie es nur Typen auf Referenz tun können.
Normalerweise spielt es keine Rolle, dass viel, aber wenn Sie eine Umsetzungsfunktion implementieren (wie hier in MSDN ) wird es nicht , indem man als Operator aufgerufen werden.
So ist der als Bediener nützlich, um „nach oben und unten das Erbe hiearchy“: Wenn Sie eine Klasse Person haben, können Sie tun: Person p = new Person (); ojbect o = p als Objekt; p = o als Person; Aber in allen Fällen das Objekt im Speicher wird nicht in irgendeiner Weise verändert wird, nur den Verweis auf mich.
Ich hoffe, das hilft