Crea un'istanza & # 8220; AS & # 8221; parola chiave
Domanda
Di recente ho iniziato a lavorare con JSON e il framework ExtJs e ho trovato il seguente codice in un esempio.
recuperiamo le informazioni dal frontend usando questo:
object updatedConfig = JavaScriptConvert.DeserializeObject(Request["dataForm"]);
Quindi nell'esempio fanno quanto segue:
JavaScriptObject jsObj = updatedConfig as JavaScriptObject;
Non ho mai visto " come " parola chiave utilizzata in questo modo prima. È solo un'altra forma di inscatolamento esplicito della variabile updatedConfig come JavaScriptObject o c'è qualcosa che non capisco al riguardo?
Grazie
Soluzione
Questo è noto come cast sicuro. Ciò che fa è che tenta di trasmettere da un tipo a un altro e se il cast fallisce restituisce null
invece di lanciare un InvalidCastException
.
In realtà ci sono due istruzioni IL separate per gestire la differenza tra " as
" colata e colata statica normale. Il seguente codice C # contiene entrambi i tipi di casting:
using System;
class Program
{
static void Main()
{
Object o = null;
String s0 = (String)o;
String s1 = o as String;
}
}
Il primo cast usa l'istruzione castclass
IL e il secondo cast usa l'istruzione isinst
.
Vedi Casting vs usando la parola chiave "as" in il CLR per una spiegazione più dettagliata.
Altri suggerimenti
Il come parola chiave è più sicuro modo per lanciare oggetti in C #.
SomeType a = obj as SomeType;
Significa che se obj
è di tipo SomeType
, obj
verrà inserito in quel tipo. Se obj
è nullo o non è di tipo SomeType
, a sarà nullo.
Un altro vantaggio della parola chiave as è che genererà un'eccezione in fase di compilazione se il tipo non può essere lanciato dove as (cast) non si interrompe fino al runtime.
Inoltre, è importante ricordare che " come " opera nel riferimento non nell'oggetto stesso. Ecco perché può restituire null invece di generare un'eccezione, poiché l'oggetto rimarrà intatto. Ed è per questo che puoi farlo solo su tipi di riferimento.
Normalmente non importa molto, ma se si implementa una funzione di casting (come qui in MSDN ) verrà non invocato usando come operatore.
Quindi, l'operatore as è utile per " su e giù per l'ereditarietà hiearchy " ;: Se hai una persona di classe, puoi fare: Person p = new Person (); ojbect o = p come oggetto; p = o come persona; Ma in ogni caso l'oggetto in memoria non verrà modificato in alcun modo, ma solo il riferimento ad esso.
Spero che aiuti