2009-03-04 21 views
2

Ich habe vor kurzem mit JSON und dem ExtJs-Framework zu arbeiten begonnen und ich bin in einem Beispiel auf den folgenden Code gestoßen.Instanziieren "AS" Schlüsselwort

rufen wir die Informationen aus dem Frontend mit diesem:

object updatedConfig = JavaScriptConvert.DeserializeObject(Request["dataForm"]); 

Dann im Beispiel sich wie folgt vor:

JavaScriptObject jsObj = updatedConfig as JavaScriptObject; 

Ich habe noch nie so verwendet, die „als“ Schlüsselwort gesehen Vor. Ist das nur eine weitere Form, die Variable updateConfig explizit als JavaScriptObject einzubetten, oder verstehe ich etwas nicht?

Dank

Antwort

3

Dies ist bekannt als eine sichere Besetzung. Was ist, ist es versucht, von einem Typ zu einem anderen zu werfen und wenn die Besetzung fehlschlägt, gibt es null zurück, anstatt eine InvalidCastException zu werfen.

Es gibt tatsächlich zwei separate IL-Anweisungen, um den Unterschied zwischen "as" Casting und normalem statischem Casting zu behandeln. Der folgende C# Code enthält, beiden Arten des Gießens:

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.

Weitere Informationen finden Sie unter Casting vs using the 'as' keyword in the CLR.

2

Die as keyword ist ein sicherer Weg, um Objekte in C# zu werfen.

SomeType a = obj as SomeType; 

bedeutet, wenn obj vom Typ Sometype ist, wird obj in dieser Art gegossen werden. Wenn obj null ist oder nicht vom Typ SomeType ist, wird a null sein.

+1

Es ist auch schneller zu bedienen ‚als‘ und prüfen, ob null hilft als die Art zu überprüfen, mit ‚ist‘ und führen Sie dann einen Hartguss. Im letzteren Fall wird der Typ zweimal überprüft. –

+0

@DaveVandenEynde Interessanterweise erwähnte Jon Skeet in seiner C# in Depth 2nd Edition, dass er ein Timing von 'as' gegen 'is 'und eine Besetzung für eine Reihe von Objekten gemacht hat, wo 1/3 von ihnen keine Boxed Integer waren 'ist' plus die Besetzung war 20x schneller. (S. 121) schien für mich kontraintuitiv ... aber meine Tests bestätigten das. – itsmatt

+0

@itsmatt Können Sie eine Kapitel-/Abschnittsreferenz hinzufügen? Seite 121 behandelt NULL-Typen. –

0

Ein weiterer Vorteil des as-Schlüsselworts besteht darin, dass es eine Kompilierungszeitausnahme auslöst, wenn der Typ nicht umgewandelt werden kann, während (cast) bis zur Laufzeit nicht bricht.

0

Es ist auch wichtig zu bedenken, dass "as" in der Referenz nicht im Objekt selbst funktioniert. Aus diesem Grund kann NULL zurückgegeben werden, anstatt eine Ausnahme auszulösen, da das Objekt intakt bleibt. Und deshalb können Sie das nur auf Referenztypen tun.

Normalerweise spielt es keine Rolle, dass viel, aber wenn man eine Umsetzungsfunktion (wie hier in MSDN) implementieren wird nicht, indem man als Operator aufgerufen werden.

So, der as-Operator ist nützlich, um "die Erbhierarchie hoch und runter": 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 wird das Objekt im Speicher in keiner Weise verändert, nur die Referenz darauf.

Hoffnung, die