Pregunta

Cuando sale C # 4.0 y tenemos la palabra clave dinámica como se describe en esta excelente presentación de Anders Hejlsberg , (C # está evolucionando más rápido de lo que puedo seguir ... No tuve mucho tiempo para familiarizarme con la palabra clave var)

¿Seguiría necesitando la palabra clave var? ¿Hay algo que var pueda hacer ... que la dinámica no pueda?

var x = SomeFunctionThatIKnowReturnsSomeKindOfList();
// do something with x

dynamic x = SomeFunctionThatIKnowReturnsSomeKindOfList();
// do something with x
¿Fue útil?

Solución

No, son muy diferentes.

var significa " inferir el tipo de la variable en tiempo de compilación " - pero todavía está completamente vinculado estáticamente.

dynamic significa " asumir que puedo hacer lo que quiera con esta variable " - es decir, el compilador no sabe qué operaciones están disponibles, y el DLR resolverá lo que significan las llamadas realmente en el momento de la ejecución.

Espero usar dynamic muy raramente, solo cuando realmente quiero un comportamiento dinámico:

  • var le permite detectar errores tipográficos, etc. en tiempo de compilación
  • el código enlazado estáticamente siempre se ejecutará más rápido que el código enlazado dinámicamente (incluso si la diferencia se vuelve razonablemente pequeña)
  • el código enlazado estáticamente brinda más soporte en tiempo de compilación más allá de solo errores: puede encontrar jerarquías de llamadas, la refactorización funcionará mejor, Intellisense está disponible, etc.

Otros consejos

Dynamic y var representan dos ideas completamente diferentes.

var

Var esencialmente le pide al compilador que descubra el tipo de la variable basándose en la expresión en el lado derecho de la instrucción de asignación. La variable se trata exactamente como si se declarara explícitamente como el tipo de expresión. Por ejemplo, las siguientes dos declaraciones son equivalentes

var a = "foo";
string a = "foo";

La clave para llevar aquí es que '' var '' es 100% seguro y es una operación de tiempo de compilación

dynamic

Dinámico es, en muchos sentidos, exactamente lo contrario de la var. El uso dinámico es esencialmente eliminar todo tipo de seguridad para la variable en particular. De muchas maneras no tiene tipo. Cuando llama a un método o campo en la variable, la determinación sobre cómo invocar ese campo se produce en tiempo de ejecución. Por ejemplo

dynamic d = SomeOperation();
d.Foo(); // Will this fail or not?  Won't know until you run the program

La clave para llevar aquí es esa "dinámica" no es de tipo seguro y es una operación en tiempo de ejecución

Sí, aún necesitará var:

Var es una variable cuyo tipo será inferido por el compilador.
dinámico tendrá su tipo asignado en tiempo de ejecución

Entonces:

Var i = "Hello World"

tendrá su tipo inferido como un tipo de cadena al hacerlo, la inteligencia le dará todos los métodos que la cadena puede usar como,

i.Split("/")

Donde como:

dynamic i = "Hello World"

no tendrá su tipo inferido hasta el tiempo de ejecución porque el cumplidor aún no sabe de qué tipo es, pero aún le permitirá hacer:

<*>

pero cuando llama al método que necesita, puede fallar porque el tipo es incorrecto y el método no está allí.

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