Pregunta

Recientemente comencé a trabajar con JSON y el marco de trabajo de ExtJs y encontré el siguiente código en un ejemplo.

recuperamos la información de la interfaz usando esto:

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

Luego en el ejemplo hacen lo siguiente:

JavaScriptObject jsObj = updatedConfig as JavaScriptObject;

Nunca he visto el " como " palabra clave utilizada así antes. ¿Es esta otra forma de encajonar explícitamente la variable updatedConfig como JavaScriptObject o hay algo que no entiendo sobre esto?

Gracias

¿Fue útil?

Solución

Esto se conoce como un reparto seguro. Lo que hace es que intenta realizar la conversión de un tipo a otro y si la conversión falla, devuelve null en lugar de lanzar una InvalidCastException .

En realidad, hay dos instrucciones de IL separadas para manejar la diferencia entre " as " Fundición y fundición estática normal. El siguiente código de C # contiene ambos tipos de casting:

using System;

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

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

El primer lanzamiento utiliza la instrucción IL castclass y el segundo lanzamiento utiliza la instrucción isinst .

Consulte Casting vs usando la palabra clave 'as' en el CLR para una explicación más detallada.

Otros consejos

El como palabra clave es más seguro Manera de lanzar objetos en C #.

SomeType a = obj as SomeType;

Significa que si obj es de tipo SomeType , obj se convertirá en ese tipo. Si obj es nulo o no es del tipo SomeType , será nulo.

Otra ventaja de la palabra clave as es que lanzará una excepción de tiempo de compilación si el tipo no se puede convertir donde no se rompe hasta que se ejecute el tiempo de ejecución.

Además, es importante recordar que " como " Opera en la referencia no en el objeto en sí. Es por eso que puede devolver nulo en lugar de lanzar una excepción, porque el objeto permanecerá intacto. Y es por eso que solo puedes hacerlo en tipos de referencia.

Normalmente, no importa mucho, pero si implementa una función de conversión (como aquí en MSDN ) no se invocará utilizando como operador.

Por lo tanto, el operador as es útil para " mover hacia arriba y hacia abajo en la búsqueda de herencia " ;: si tienes una Persona de clase, puedes hacer: Persona p = nueva Persona (); ojbect o = p como objeto; p = o como Persona; Pero en todos los casos, el objeto en la memoria no se modificará de ninguna manera, solo la referencia a él.

Espero que ayude

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top