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

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top