2008-11-18 28 views
26

Cuando C# 4.0 sale y tenemos la dinámica de palabras clave como se describe en este excellent presentation by Anders Hejlsberg, (C# está evolucionando más rápido de lo que puede mantenerse al día .. yo no tenía mucho tiempo para familiarizarme con la palabra clave var)¿La nueva palabra clave 'dinámica' C# 4.0 desaprueba la palabra clave 'var'?

¿Todavía necesitaría la palabra clave var? ¿Hay algo que var pueda hacer ... esa dinámica no puede?

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

dynamic x = SomeFunctionThatIKnowReturnsSomeKindOfList(); 
// do something with x 
+3

Tal vez no es importante, pero mientras var es una palabra clave, dinámico no lo es. Es un tipo. – TimothyP

+0

Entonces, ¿es "dinámico" básicamente como declarar algo de tipo "objeto" pero el compilador no se queja, cuando llama métodos que no existen? –

+1

Sí, se resolverá en tiempo de ejecución. Si existe, el método se llamará ... si no Boom! – Gishu

Respuesta

72

No, son muy diferentes.

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

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

que espera utilizar dynamic muy raramente - solamente cuando verdaderamente quiero comportamiento dinámico:

  • var le permite ponerse errores tipográficos, etc. en tiempo de compilación
  • código estáticamente ligada siempre va a correr más rápido que de forma dinámica código enlazado (incluso si la diferencia es razonablemente pequeña)
  • 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.
+0

Esa fue mi pieza faltante ... var es de enlace estático (y por lo tanto viene con los beneficios de verificaciones en tiempo de compilación, herramientas, etc.) – Gishu

+1

básicamente puedes pensar en var como azúcar sintáctico –

17

Dinámico y var representan dos ideas completamente diferentes.

var

Var pregunta, esencialmente, el compilador de averiguar el tipo de la variable en base a la expresión en el lado derecho de la sentencia de asignación. La variable se trata exactamente como si se declarara explícitamente como el tipo de la expresión. Por ejemplo, las dos sentencias siguientes son equivalentes

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

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

dinámica

dinámica es en muchos sentidos, el opuesto exacto de var. Usar la dinámica es esencialmente eliminar todo tipo de seguridad para la variable en particular. De muchas maneras no tiene ningún tipo. Cuando llama a un método o campo en la variable, la determinación sobre cómo invocar ese campo ocurre 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 que "dinámica" no es de tipo seguro y es una operación de tiempo de ejecución

+2

Aún así es seguro, es solo que el tipo no se conoce en tiempo de compilación. Si el objeto real (tiempo de ejecución) no tiene un miembro en particular al que está intentando acceder, obtendrá una excepción. –

+0

Comparar: puede usar var en .NET 2.0 Projects. No es dinámico –

1

Si usted todavía necesita var:

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

Así:

Var i = "Hello World" 

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

i.Split("/") 

Donde como:

dynamic i = "Hello World" 

no tendrá su tiempo de ejecución hasta el tipo inferido debido a que el compilador dosn't saber qué tipo es todavía, pero aún le permiten hacer:

i.Split("/") 

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

+0

Pedant: "var" es una * variable * cuyo tipo será inferido por el compilador. El objeto no se ve afectado. "dinámico" es una variable que está tipeada estáticamente como "dinámica"; es el mecanismo de envío el que cambia (la variable todavía se escribe como "dinámica"). –

Cuestiones relacionadas