miércoles, 6 de noviembre de 2013

Asignación implícita de tipos, var



La palabra reservada var, viene a significar una asignación implícita de tipos. Esto se traduce en que el compilador será el que averigüe cual es el tipo que hay que asignar a esa variable, ósea utilizará la Inferencia de Tipos.

Cuando salieron las primeras noticas sobre esta mejora, trajo mucha controversia, al igual que los métodos extensores, dentro de la comunidad ya que muchos pensaban que esto rompía las buenas prácticas de programación y la fortaleza de tipos, cosa que no era cierta como veremos más adelante.


Es fácil confundir este tipo de variable con antiguo y costoso Variant de Visual Basic 6.0, o llegar a pensar que simplemente es un objeto de tipo object camuflado, pero nada de eso, es mucho más.




Recuerda que aquí tienes el indice de todos los posts del Curso de LinQ.


Vamos a ver un ejemplo para salir de dudas:

var miVariable = "Esta es mi variable";

Como podemos ver, a esta variable ‘var’, le estamos asignando un objeto string.


















Como podemos ver en la imagen, cuando hacemos uso del intellisense, éste en tiempo de compilación, nos muestra que es una variable de tipo string y nos pone a nuestra disposición toda su interface.











Como podemos ver la imagen, el compilador infiere el tipo de después del igual, para asignárselo a el var.

Otros ejemplos un poco más generalizados:

var numero   = 9;                               // int
var fecha    = DateTime.Today;                  // DateTime
var booleano = true;                            // bool
var clase    = new System.IOFileInfo("ruta");  // FileInfo

En la primera línea de este ejemplo, vemos que el compilador inferirá el tipo int a través del valor ‘9’. Algún purista en esto de la programación hubiera puesto el grito en el cielo, ya que un objeto de tipo short, ocupa menos memoria, pero el framework no trabaja así, y opta por el tipo Int32, ya que está mucho más optimizado, algo que podemos comprobar en otros métodos como por ejemplo el DateTime.Today.Day-Month-Year, que también nos devuelven un Int32.

Podríamos forzar el tipo a otro numérico con cualquier tipo de casting:

var numero = (short)9;  


Esto también podría pasar con la inferencia entre los tipos float, doublé o decimal:

/// Mediante casting
var float1   = (decimal) 9.1;
var double1  = (double)  9.1;
var decimal1 = (decimal) 9.1;

/// Mediante notación
var float1   = 9.1f;
var double1  = 9.1d;
var decimal1 = 9.1m;


Limitaciones de las variables con asignación implícita:

  • Solo se puede utilizar cuando la variable se inicializa dentro de la misma instrucción.
  • No se puede utilizar en campos de clase.
  • No es posible inicializar varias variables de tipo implícito dentro de la misma instrucción.
  • No se puede utilizar como tipo para para parámetros de métodos.
  • No se puede utilizar como tipo de devolución
  • No se puede utilizar como parámetro de tipo en generics.


El uso de la palabra reservada var, se ha generalizado bastante, tanto es así que software como Resharper, lo aconseja por defecto dentro de suite para Visual Studio. En ocasiones puede hacernos el trabajo más sencillo y reduce el código, pero en otras puede llegar a dificultar la comprensión del código para otros programadores.


El uso de la palabra reservada var, es necesaria y obligatoria para los tipos anónimos (que veremos en el siguiente post), y también puede ser recomendada, según gustos claro para el uso con LinQ,  usings o instanciaciones tan evidentes como las que hemos visto en este post, pero para mi gusto, abusar de ella puede llegar a ser contraproducente.

var a = Environment.GetEnvironmentVariables().GetEnumerator();

Ya que en este tipo de sentencia nos puede ayudar bastante saber el tipo dentro de la instanciación. Como no, también es importantísimo, el nombra bien las variables con nombres descriptivos, y nada de eso de ‘a’.



Como hemos podido comprobar, según vamos avanzando, vamos encadenando conocimentos dentro de las bases que forman LinQ y todo su entorno.