Pregunta

La palabra clave var elimina la necesidad de una palabra explícita tipo declaración y he leído con interés la SO discusión de cuándo podría ser apropiado.

También he leído sobre (pero no usado) Boo que parece tomar las cosas como un avance más haciendo que sea opcional para declarar una variable local . Con Boo, tanto el tipo como la declaración pueden estar implícitos.

Lo que me lleva a preguntarme, ¿por qué los diseñadores de lenguaje C # se molestaron en incluir una palabra clave var?

Actualización : Sí, var admite tipos anónimos, pero los tipos anónimos por sí mismos no necesitan la palabra clave var ...

var anon = new { Name = "Terry", Age = 34 };

versus

anon = new { Name = "Terry", Age = 34 };
¿Fue útil?

Solución

Actualización: Aquí hay dos preguntas relacionadas: 1. ¿Por qué tengo que declarar variables? 2. ¿De qué sirve " var " en un lenguaje que te hace declarar variables?

Las respuestas a (1) son numerosas y se pueden encontrar en otros lugares para esta pregunta. Mi respuesta a (2) está abajo:

Como han dicho otros comentaristas, LINQ usa esto para sus tipos anónimos. Sin embargo, LINQ es en realidad una instancia de un problema más general en el que el tipo del lado derecho de una expresión es desconocido para el programador o es extremadamente detallado. Considere:

SomeGeneric<VeryLongTypename<NestedTypename>> thing = new   
SomeGeneric<VeryLongTypename<NestedTypename>>();

Detallado y propenso a errores, ¿verdad? Entonces ahora te dejan hacer esto:

var thing = new SomeGeneric<VeryLongTypename<NestedTypename>>();

Al reducir la duplicación de información, se eliminan los errores. Tenga en cuenta que no solo hay errores de escritura, aquí: es posible que el tipo de la expresión de la izquierda se escriba incorrectamente de tal manera que el compilador pueda emitir silenciosamente de izquierda a derecha, pero el elenco realmente pierde parte de la propiedad rvalue. Esto es aún más importante cuando los tipos devueltos por rvalue pueden ser desconocidos o anónimos.

Otros consejos

Sin la palabra clave var, es posible crear accidentalmente una nueva variable cuando realmente tenía la intención de utilizar una variable ya existente. por ejemplo,

name = "fred";
   ...
Name = "barney"; // whoops! we meant to reuse name

Entiendo la necesidad de var y su propósito es excelente. No tener palabras clave y solo definir variables sobre la marcha sin tipo es aterrador. Estás lastimando al siguiente tipo que tiene que mantener tu código o a ti mismo si necesitas volver a trabajar el código que no has tocado en más de un año. No estoy seguro de que se deba abrir una puerta en C # y espero que no lo sea, ya que var ya está causando problemas de legibilidad cuando se usa en exceso cuando no es necesario.

Casi todos los ejemplos de .net 3.5 que estoy viendo últimamente tienen todas las variables definidas con var.

El argumento que hago es que realmente sacrifica la legibilidad en aras de guardar las pulsaciones de teclas cuando se usa en exceso. Por ejemplo:

// What myVar is, is obvious
SomeObject myVar = new SomeObject();

// What myVar is, is obvious here as well
var myVar = new SomeObject();

El problema que veo es que la gente lo usa en todas partes ... por ejemplo:

// WTF is var without really knowing what GetData() returns?
// Now the var shortcut is making me look somewhere else when this should
// just be readable!
var myVar = GetData();

// If the developer would have just done it explicitly it would actually
// be easily readable.
SomeObject myVar = GetData();

Entonces, el próximo argumento será, simplemente nombra mejor la función ...

var weight = GetExactWeightOfTheBrownYakInKilograms();

Todavía no sé lo que regresará. ¿Es un objeto int, decimal, flotante, de peso, qué? Todavía tengo que perder el tiempo buscándolo ... necesito la muleta inteligente para salvar el día de mi programación perezosa. Tal vez incluya el tipo de retorno en el nombre de la función. Buena idea, ahora usar var no nos ha ahorrado nada excepto hacer que todas mis funciones tengan nombres realmente largos.

Creo que la gente acaba de usar var y está llevando a una programación perezosa que a su vez conduce a un código más difícil de leer. Cada vez que escribe la palabra clave var, debe tener una buena razón por la que la está usando en lugar de ser explícita.

Esto es un poco subjetivo, pero creo que diseñar C # 3.0 para que tenga la "var" La palabra clave para variables escritas implícitamente en lugar de ninguna palabra clave hace que el código sea más legible. Por ejemplo, el primer bloque de código a continuación es más legible que el segundo:

Obvio donde se declara la variable:

var myVariable = SomeCodeToSetVariableHere;
myVariable = SomeOtherCodeTOSetVariable;

No es obvio dónde se declara la variable:

myVariable = SomeCodeToSetVariableHere;
myVariable = SomeOtherCodeTOSetVariable;

Estos son ejemplos demasiado simplistas. Creo que puedes ver a dónde va esto. En situaciones complejas, podría ser bueno poder encontrar el lugar donde una variable está realmente definida.

En su pregunta, var agrega valor al código diciéndole al compilador que la palabra anon ahora es legal para usar en cualquier lugar donde espere ver un elemento del tipo implícito en la tarea. Requerir la introducción de nombres al compilador como este permite que el compilador rechace cosas que no se le han dicho explícitamente que están permitidas y, por lo tanto, detecta ciertos tipos de errores en el momento de la compilación para que no exploten en tiempo de ejecución.

Por ejemplo, en la sección de actualización de su pregunta, preguntó sobre este fragmento:

anon = new { Name = "Terry", Age = 34 };

El problema con permitirlo de esta manera es que convierte cualquier cosa en el lado izquierdo de cualquier tarea donde el nombre no existía previamente en una declaración variable, incluso si es realmente un error tipográfico. Si más adelante en el programa asigna algo más a anon y luego aún más al referenciar el nuevo valor, pero la declaración del medio tenía un error tipográfico, tiene un problema que no aparecerá hasta el tiempo de ejecución.

Su respuesta es que Boo lo hace, por lo que debe estar bien o al menos posible. Pero eso es un arenque rojo. Estamos hablando de C #, no de Boo. Uno de los propósitos de C # es tener un lenguaje en el que el compilador pueda detectar tantos errores como sea posible. Boo también quiere hacer eso, pero también quiere ser más como Python. Por lo tanto, sacrifica parte (no toda) de la seguridad en tiempo de compilación de C # a cambio de una sintaxis similar a la de Python.

descargo de responsabilidad: mis ejemplos son Java porque eso es lo que sé, pero los conceptos deberían ser idénticos.

He votado la respuesta que considero crítica (es demasiado fácil crear accidentalmente una nueva variable).

bill=5;
bi11=bill+5

¿Cuál es el valor de la factura?

Dicho esto, a veces me resulta algo irritante escribir:

DataOutputStream ds=new DataOutputStream();

Parece redundante, pero sinceramente, no hay nada realmente malo en ello. No lleva más tiempo escribirlo dos veces, y es extremadamente útil. Lo que lleva tiempo es cuando tienes preguntas, cuando no estás seguro de cómo usar alguna API. Si realmente te molesta escribir esa declaración de tipo dos veces, ¿por qué estás perdiendo el tiempo aquí? Desde que comenzó a leer esto, podría haber escrito 30 o 40 declaraciones, suficiente para cada declaración que necesitará durante las próximas dos semanas.

Supongo que estoy diciendo que, aunque entiendo el estrés emocional que puede causar repetirse, la consistencia, la claridad y la capacidad de crear herramientas más inteligentes hacen que valga la pena.

Una cosa más, la mayoría de las veces el código no debería ser como mi ejemplo anterior. Lo que deberías hacer es esto:

DataOutput ds=new DataOutputStream();

Esto oculta inmediatamente el hecho de que está utilizando una clase concreta en una plantilla. Esa plantilla debería poder hacer todas las operaciones que necesita en su clase. Más tarde, si desea reemplazar ds con algún otro tipo de flujo de salida, simplemente cambiando esa línea única lo arreglará. Si estaba utilizando las funciones que no están disponibles para DataOutput al transmitir a DataOutputStream, el editor lo resolverá fácilmente y se lo hará saber.

Para tipos anónimos, que entre otras cosas admiten LINQ.

http://www.blackwasp.co.uk/CSharpAnonTypes.aspx

Creo que se agregaron var (y varias otras palabras clave nuevas) específicamente para admitir Linq.

var es la palabra clave utilizada para crear un tipo anónimo: consulte http: / /msdn.microsoft.com/en-us/library/bb397696.aspx

Los tipos anónimos se pueden usar en otros lugares que no sean Linq.

var es extremadamente útil para Linq. De hecho, según un autor experto, " Sin & # 8216; var & # 8217 ;, LINQ se vuelve demasiado doloroso de usar. "

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