2010-09-05 8 views
8

Al principio pensé que algo como:
¿Por qué usar la escritura dinámica en C#?

var aName=getAllSomethings(); 

Es muy ilegible, y por lo que vamos a usar tipado dinámico justo cuando no hay espacio para la confusión, tales como:

AClassName aName = new AClassName(); 

Aquí,

var aName=new AClassName(); 

parece legible. Pero de lo que leí (here) esa tipada dinámica también tiene un precio en rendimiento.
Intenté leer todas las otras publicaciones en ese enlace para entender dónde debería usar el tipado dinámico, pero no pude encontrar ni siquiera una buena razón. ¿Debo esperar cuando me digo a mí mismo: "Esto solo se puede resolver con tipeo dinámico"? ¿O hay mejores razones (prácticas) para usarlo?

Gracias.

Editar: Mi error (-:. Cerrará esta cuestión lo antes posible

+2

¡Pero solo piensa en cuánto has aprendido! ;) – Robaticus

+1

@Robaticus: +1 en eso. Es por eso que tercamente afirmo que las únicas preguntas estúpidas son aquellas que no se hacen, lo que hace que la gente no aprenda. Esta pregunta ayuda a despejar un malentendido que creo que es bastante común, por lo que definitivamente cumple un propósito. –

+2

No es necesario cerrarlo, creo que es una pregunta bastante común. Otras personas aún pueden beneficiarse de la información. –

Respuesta

26

var no es tipado dinámico Es que el tipo de aName se infiere por el compilador

Su ejemplo es.. siendo totalmente estático de tipos, y no tiene ninguna penalización en el rendimiento. Su código se compila en exactamente la misma IL, ya que sería con un nombre de tipo explícito.

Ahora en C# 4, tipado dinámico hace exis t, pero debería escribirse como:

dynamic aName = new AClassName(); 

Mi opinión personal es que tipado dinámico será relativamente rara vez son útiles en C# 4 - básicamente cuando usted está tratando con los datos que ya sólo se conoce de forma dinámica, por ejemplo, reflexión o navegando XML.

5

El uso de la palabra clave var no es un tipado dinámico. La palabra clave var es manejada por el compilador. La variable se tipará estáticamente en función de la primera asignación a la variable.

El tipo de:

var value = new StringBuilder(); 

Es StringBuilder. No hay forma de cambiar ese tipo (que es lo que la tipificación dinámica permitiría).

Lo que Jon Skeet se refiere en su blog es la palabra clave dynamic. Esa es una bestia completamente diferente.

6

Esto no es tipado dinámico. El var declara un tipo estático conocido en tiempo de compilación y será absolutamente equivalente a declarar el nombre del tipo. El compilador deducirá el tipo y lo reemplazará en el ensamblaje resultante.

2

Eso no es tipado dinámico. La tipificación dinámica es a través del tipo "dinámico" (por extraño que parezca). Usar var no tiene ninguna sobrecarga, es una taquigrafía de codificación que todavía produce variables muy tipadas.

2

Usted no está entendiendo por qué la escritura dinámica es.

"var" usa Type Inference para deducir en tiempo de compilación el tipo de la variable. Su mecanismo es bastante directo y no tiene ningún impacto en el rendimiento. Una variable declarada con "var" solo puede ser un tipo exacto (o derivaciones de ese tipo).

Las variables dinámicas permiten que una variable retenga cualquier tipo en tiempo de ejecución, y aún realizar operaciones en ese objeto como si supiéramos lo que es compatible. Cada una de estas llamadas hace que el tiempo de ejecución realice una comprobación para ver si la llamada al método es realmente compatible. Eso es parte de por qué el tipado dinámico tiene una sobrecarga de tiempo de ejecución.

2

Como todos los demás han mencionado, la palabra clave 'var' no nos da tipado dinámico. El tipo se deduce en tiempo de compilación.

Uso var cuando creo que tiene sentido; es decir, cuando el tipo es obvia y se reduce el nivel de detalle de una declaración:

var someDict = new Dictionary<string, int>(); 

En lugar de ...

Dictionary<string, int>() someDict = new Dictionary<string, int>(); 

Sin embargo, en su ejemplo aquí:

var aName=getAllSomethings(); 

No utilizaría 'var' porque, como ya habrás notado, debes comprobar el tipo de devolución de 'getAllSomethings()' (estilo de nomenclatura incorrecto para C# BTW) para saber qué es 'aName', que solo hace que el código sea menos legible .

+2

Sí, pero - y he argumentado esto antes - es el nombre de la función que está mal aquí, no 'var'. Si' var' alguna vez hace que algo sea menos legible, no es el error de 'var', son los nombres que elige para sus métodos y variables que están equivocados. – JulianR

+1

No estoy de acuerdo. ¿De verdad pone el tipo de retorno de cada método en el nombre del método en sí, es decir," GetMemberIdListInt "? Eso es las tonterías que enseñan en introducción al lenguaje XXX 101, el buen nombre de método no requiere ese tipo de cosas. –

+0

Aunque, en este caso, tiene razón; el nombre del método (y variable) es terrible en el ejemplo del PO. –

Cuestiones relacionadas