2009-03-04 9 views
2

J'ai récemment commencé à travailler avec JSON et le framework ExtJs et j'ai rencontré le code suivant dans un exemple.Instancier le mot-clé "AS"

nous récupérons les informations du frontend en utilisant ceci:

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

Puis, dans l'exemple, ils font ce qui suit:

JavaScriptObject jsObj = updatedConfig as JavaScriptObject; 

Je ne l'ai jamais vu le « comme » mot-clé utilisé comme avant. Est-ce juste une autre forme de boxer explicitement la variable updatedConfig en JavaScriptObject ou y a-t-il quelque chose que je ne comprends pas?

Merci

Répondre

3

Ceci est connu comme un casting sûr. Ce qu'il fait, c'est essayer de passer d'un type à un autre et si la distribution échoue, il retourne null au lieu de lancer InvalidCastException.

Il existe en fait deux instructions IL distinctes pour gérer la différence entre la coulée "as" et la coulée statique normale. Le code C# contient les deux types de coulée:

using System; 

class Program 
{ 
    static void Main() 
    { 
     Object o = null; 

     String s0 = (String)o; 
     String s1 = o as String; 
    } 
} 

La première distribution utilise l'instruction IL castclass et la deuxième distribution utilise l'instruction isinst.

Veuillez voir Casting vs using the 'as' keyword in the CLR pour une explication plus détaillée.

2

Le as keyword est un moyen plus sûr de jeter des objets en C#. Signifie que si obj est de type SomeType, obj sera casté dans ce type. Si obj est null ou n'est pas de type SomeType, a sera null.

+1

Il est également plus rapide d'utiliser « comme » et vérifier que nul pour vérifier le type avec « est », puis faire un casting difficile. Le type sera vérifié deux fois dans ce dernier cas. –

+0

@DaveVandenEynde Jon Skeet a mentionné dans son C# en profondeur 2ème édition qu'il a fait un certain temps de 'as' contre' is' et une distribution pour un tableau d'objets où 1/3 d'entre eux n'étaient pas des entiers encadrés et a constaté que 'is' plus le casting était 20 fois plus rapide. (121) Semblait contre-intuitif à moi ... mais mes tests ont confirmé cela. – itsmatt

+0

@itsmatt Pourriez-vous ajouter une référence de chapitre/section? La page 121 concerne les types Nullables. –

0

Un autre avantage du mot-clé as est qu'il déclenchera une exception de compilation si le type ne peut pas être lancé là où (cast) n'est pas interrompu avant l'exécution.

0

Aussi, il est important de se rappeler que "as" opère dans la référence et non dans l'objet lui-même. C'est pourquoi il peut retourner null au lieu de lancer une exception, car l'objet restera intact. Et c'est pourquoi vous ne pouvez le faire que sur les types de référence.

Normalement, il n'a pas d'importance tant que ça, mais si vous mettez en œuvre une fonction de coulée (comme ici à MSDN), il ne être invoquée en utilisant comme opérateur. Donc, l'opérateur as est utile pour "monter et descendre la hiérarchie d'héritage": Si vous avez une classe Person, vous pouvez faire: Personne p = new Person(); ojbect o = p comme objet; p = o en tant que personne; Mais dans tous les cas, l'objet en mémoire ne sera pas modifié de quelque façon que ce soit, juste la référence à celui-ci.

espoir qui aide

Questions connexes