Novedades lenguaje C# 3.0 (III): Declaración implícita de tipos

En mi post anterior sobre novedades de C# 3.0 hablé sobre los tipos anónimos. En el ejemplo de código use una palabra clave nueva, ‘var’, cuyo significado dejé para hoy. Algún lector asiduo se adelantó ademas preguntando algo sobre cómo se determinaban los tipos de las propiedades de las clases anónimas así definidas.


La nueva palabra clave ‘var’ sirve para declarar variables locales sin indicar su tipo. Así podemos escribir, por ejemplo:


var i = 1;
var nombre = «JM»;
var personajillo = new PersonaHumana(«Perico», «De los palotes», 42)

Es muy parecido a la sintaxis de JavaScript, pero con una importante diferencia: el hecho de que no indiquemos el tipo no quiere decir que no lo tengan, ya que C# sigue siendo un lenguaje fuertemente tipado. Lo hace var no es declarar una variable sin tipo, sino que declara la variable con el tipo adecuado para contener el dato indicado, siendo dicho tipo deducido a partir del valor.


Así en el código anterior ‘i’ será un entero, ‘nombre’ será una cadena y ‘personajillo’ será una referencia a un objeto de la clase indicada.


En JavaScript y otros lenguajes sin tipado fuerte puedes cambiar alegremente el tipo de dato almacenado por una variables, pasando de contener un entero a una cadena, por ejemplo. En C#, gracias a los dioses, no es así.


Esta característica se ha introducido para dar soporte a los tipos anónimos que expliqué en el anterio post, y por lo tanto como expliqué allí, realmente para dar soporte a LINQ.


Por mi parte recomendaría no usarlos en situaciones normales porque el código queda menos claro y pueden dar lugar a confusiones, si bien no tengo otras razone de peso como por ejemplo que bajen el rendimiento o algo así. De hecho es lo miso que declarar el tipo de verdad, pero desde mi punto de vista dejas más cabos sueltos que si lo haces explícito.

Sin categoría

7 thoughts on “Novedades lenguaje C# 3.0 (III): Declaración implícita de tipos

  1. Hola J.Manuel:

    Muy buenos la serie de post sobre las novedades de C# 3.0. Por favor sigue con ello. Gracias.

    Quizás, para aclarar el código, cuando se utila la palabra clave «var» sería recomendable poner sufijos al nombre con el tipo de datos. Ej: var strNombre = «JM».

    Un saludo.

  2. Hola Ososan:

    Me alegro de que te guste las serie 🙂
    Los próximos días, si el trabajo me lo permite, pienso poner unos cuantos más.

    Respecto a tu sugerencia de nombrar las variables es una cuestión de gustos únicamente, claro, ya que al seguir siendo igualmente variables fuertemente tipadas no es necesario. Para eso, incluso mejor no uses var y define la variable normalmente. De todos modos cada uno debe hacer lo que le resulte más cómodo.

    Desde que .NET apareció hace ya muchos años Microsoft también desaconseja el uso de la notación húngara (que es lo que tu sugieres) pero que mucha gente que viene de VB sigue usando.

    Un saludo

    JM.

  3. Además de que lo que comenta José, he de decir que aunque uses var para declarar una variable, el intellisense mostrará el tipo real, inferido por el compilador, de la variable.

    Es decir si declaramos var s = «hola»; el intellisense nos mostrará que s realmente es de tipo string siempre que s aparezca en nuestro código y pongamos el puntero encima de s.

    Esto hace innecesario el uso de mi antigua compañera la notación hungara. Decir que a los que hemos escrito mucho C en Windows nos ha costado un poco el cambio de mentalidad. Con lo que molaba el lpsz delante de cada cadena… 🙂

    Saludos!!!

  4. Hola de nuevo:

    Lo primero de todo agradeceros a los dos vuestras aclaraciones y opiniones sobre mi comentario. Muchas gracias.

    ¿J.Manuel conoces si la versión 3.0 dispone de algún método “nuevo” dentro de la clase Array para cambiar el tamaño de una matriz sin perder los datos originales que contiene? Por si no me explicado bien, pongo un breve ejemplo. La siguiente matriz:

    int[] miMatriz = { 1, 2, 3 };

    Si la aumentamos, por ejemplo, en 2 elementos

    miMatriz = new int[miMatriz.Length + 2];

    De esta forma la matriz contiene { 0, 0, 0, 0, 0 }. Lo que yo quería decir, es que para que la matriz contenga {1, 2, 3, 0, 0}, por lo que yo sé, hay que copiarla (CopyTo) en otra matriz, luego ampliarla y finalmente “volcar” otra vez los datos originales. ¿La nueva versión mejora este pobre comportamiento?

    Saludos.

    PD: es muy posible, que pronto seas mi tutor en CampusMVP referente al curso del examen 70-536 que pretendo hacer.

  5. Hola Ososan:

    No hay nada para redimensionar las matrices como tú dices. En VB, como sabes, hay una característica Redim Preserve que hace eso que tú dices, pero no deja de ser un «azucar sintáctico» como le llaman algunos, es decir, algo para simplificar la sintaxis pero que realmente por debajo lo que hace es lo mismo que tendrías que hacer tú en C#: generar una nueva matriz con el nuevo tamaño y copiar en ella los contenidos de la anterior.
    Esto, por cierto, es muy poco eficiente en cuanto a memoria y procesador, por lo que con matrices grandes o efectuando la operación repetidamente no se recomienda hacerlo.

    ¿Quieres una buena opción que haga el trabajo?

    Usa clases ArrayList.

    Si haces el curso 70-536 seré tu tutor, pero también Rodrigo (el que puso el comentario anterior) y el Guille 🙂

    Espero verte por allí y que te identifiques, jeje

    Saludos

    JM.

  6. Ososan:
    En C# no se puede redimensionar conservando los valores, pero en .NET 2.0 existe el método Resize en la clase Array que permite redimensionar el array conservando los valores:
    int[] nums = { 1, 2, 3, 4, 5 };
    Array.Resize(ref nums, nums.Length + 2);
    // También:
    Array.Resize(ref nums, nums.Length + 2);

    En el curso 70-536 de campusMVP está explicado ;-))))

    Nos vemos

  7. Tengo un debate abierto con un colega que se ha empeñado en utilizar «var» hasta para los tipos simples de datos.
    Yo no creo que sea buena practica usar var a = 2, o var b = unObjeto.Metodo();

    Leyendo el codigo «al vuelo» no sabras los tipos de retornos, etc. Para mi es solo cuestion de vagancia. Si el compilador te determinará y generará el tipo: ?Para que arriegarse a que alguién tome la decision por tí?.

    Aclaro, que estoy en DESACUERDO CON EL ABUSO DE «VAR», que para nada es negar su utilización donde corresponda, como LINQ, etc.

    Les agradeceria opinen al respecto de si es o no buena practica, o que me remitan a algun estudio sobre el tema.

    Gracias.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *