2010-04-29 12 views
12

Leí un artículo sobre using C# 3 features in C# 2 donde puede, por ejemplo, escribir var x = 2; e incluso si el proyecto es un proyecto 2.0, el compilador de Visual Studio 2008 lo recoge y genera el mismo código que si escribe int x = 2.Está utilizando la palabra clave var bad en C# 2.0?

Pero lo que no entiendo es, ¿debería no hacer esto en algunos casos? Siempre pensé que la palabra clave var no llegó hasta C# 3 ... Si el compilador genera el mismo código y puedo escribir el código C# 3 y el código C# 2 exactamente igual, ¿cuál es la diferencia, porque la CLI es la misma? , ¿derecho?

Cita desde el enlace anterior

Detrás de las escenas, el compilador genera código regular de .NET 2.0.

¿Hay alguna diferencia entre el código .NET 2.0 y el código .NET 3?

+3

Mezcla versiones C# y .Net Framework. "usando las características de C# 3 en C# 2" - es una afirmación incorrecta. Debería ser "usar las características C# 3 en .Net 2.0". –

Respuesta

25

Me temo que está mezclando hasta versiones de C# y .NET versiones.

No puede usar var en C# 2.0, el compilador pensará que es solo un identificador. Pero puede usarlo en C# 3.0 como objetivo .NET 2.0, ya que var es solo una construcción de lenguaje (C#), no una construcción .NET. El compilador .NET lo traducirá al tipo apropiado en el CIL generado, por lo que el compilador JIT nunca lo verá y usted estará completamente bien.

Dado que el compilador VS2008 es un compilador C# 3.0, no tendrá ningún problema al utilizar var allí, independientemente de la versión de .NET que tenga como objetivo.

+0

Aha! Esta fue la respuesta que estaba buscando. Esta podría ser otra pregunta, pero ¿hay alguna diferencia entre el código resultante entre .NET 2 y .NET 3 en ese caso, es decir, el resultado después de que el compilador hace su trabajo? – Patrick

+0

El CIL es exactamente igual que si hubiera escrito el tipo devuelto por la expresión del lado derecho en su tarea; no importa a qué versión de .NET esté apuntando. – Gorpik

+0

Entonces la diferencia entre .NET 2 y .NET 3 es que .NET 3 paquetes con algunas clases adicionales (como LINQ) y la sintaxis es realmente la misma (si usa un compilador C# 3 como VS2008) – Patrick

7

var es el azúcar sintáctico en el lenguaje C# 3 que utiliza VS2008. el código aún se puede compilar para ser compatible con .net 2.0. El único problema que debe tener es si necesita editar esos archivos en VS2005.

+2

Por supuesto, es parte de C# 3. No es parte de .NET 3.5, pero eso es algo diferente. – Gorpik

+0

gracias Gorpik, editado la respuesta –

+0

Ah, ya veo. Eso tiene sentido. Por lo tanto, aún puedo orientarme a .NET 2 con mi VS 2008 y permitir que los usuarios de VS 2005 utilicen mi dll. Eso es bastante ingenioso – Patrick

1

sobre var: es la sintaxis pura del azúcar y el truco del compilador. escribiendo var le pide a un compilador que adivine el tipo basado en el lado derecho de la expresión. esto se puede hacer fácilmente compilando en .net 2.0. Es posible que Linq no funcione porque usa ensamblados de .net 3.5

+2

LINQ funcionará en el sentido de que el compilador traducirá las expresiones de consulta a llamadas a Where, SelectMany etc. Luego no podrá compilar si no puede encontrar ninguno de esos métodos (lo que normalmente sucedería, dado que System.Linq.Enumerable no existe en .NET 2.0), pero si proporciona sus propios métodos Where, SelectMany, etc., debería enlazarlos y funcionar. – Joren

-2

var se introdujo para contener las instancias de tipos anónimos en C# 3.0.

En .NET2.0 puede ser que el compilador VS2008 o C# deba reemplazarlo con el tipo real que se conoce desde el momento del diseño y si ya conocía el tipo al codificar, ¿por qué usar var! :)

+2

'var' no implica un tipo anónimo, solo lo habilita. P.ej. 'var x = 1;', x sería int, no es un tipo anónimo. –

+0

de acuerdo - var puede representar cualquier tipo. no lo usaría para un tipo ya conocido en el momento de la codificación, ¡preferiría usarlo para tipos anónimos! –

+0

y todo lo que obtengo es un voto negativo? –

4

Con respecto a su uso.

No está mal en lo que respecta a la ejecución, como ya se mencionó es simplemente azúcar de sintaxis y se reemplaza en tiempo de compilación.

Al codificar, creo que su uso es mixto. Por ejemplo:

Creo que está bien. Es fácil ver cuál es el valor

var a = "test"; 

No tan bueno, muchas personas tienen que desplazarse en el IDE para comprender realmente el código, que es un dolor.

var b = SomeReallyLongNameSpace.SubNamespace.Namespace.Class.Enum.Value1; 

Esto está bien, ustedes saben lo que el resultado se debe a un método claramente definido.

var c = GetString(); 

usted no tiene idea de un vistazo lo que se devuelve, esto no es útil y se define mejor en lugar de utilizar la palabra clave var.

var d = GetSomething(); 
+0

Estoy de acuerdo. Se trata de la legibilidad. Si el tipo que está asignando a una var es obvio, entonces use 'var'. Si no es obvio, usa el nombre del tipo. Por supuesto, cuando se trata de tipos anónimos, no tienes más remedio que usar 'var'. – alimbada

+0

Sí, bueno. Esto no fue realmente lo que pedí.Hay muchas preguntas con respecto a la palabra clave var. Me preguntaba por qué podía escribirlo en mi IDE de Visual Studio 2008 aunque mi proyecto estaba dirigido a .NET 2. Gracias por la respuesta – Patrick

+1

@Patrick, solo leí la pregunta ... El título era "Está usando el la palabra clave var bad en C# 2.0? " y dentro de ella preguntaste "Pero lo que no entiendo es, ¿no deberías hacer esto en algunos casos?". Estaba tratando de resaltar algunos casos en los que no debería hacerlo, independientemente del proceso de compilación. – Ian

Cuestiones relacionadas