RSS 2.0 Atom 1.0 CDF  
JASoft.org - Novedades lenguaje C# 3.0 (III): Declaración implícita de tipos
El blog de José Manuel Alarcón Aguín. Programación .NET y mucho más...
 

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.

Thursday, January 17, 2008 10:10:37 PM (Hora estándar romance, UTC+01:00)  #    Comments [4]   Programación  |  Trackback
Friday, January 18, 2008 1:06:27 PM (Hora estándar romance, UTC+01:00)
Puede ser útil pero mejor no abusar de ella para mantener la ilegibilidad del código.

Por ejemplo, si pongo var i = 10000 inferiría un int pero si pusiera var i = {el valor que corresponda a int.MaxValue + 1}, ¿infiere el tipo long? :-)

Saludos.
espinete
Friday, January 18, 2008 10:33:47 PM (Hora estándar romance, UTC+01:00)
Hola Espinete

De acuerdo contigo en lo de no usarlo a menos que sea necesario, como ya comento en el artículo. De todos modos "todo encaja" cuando piensas en como trabaja LINQ. Por cierto, aprovecho la ocasión para recomendar fervientemente el libro de Octacio Hernández "C# 3.0 y LINQ" de Krasis Press. En él estos conceptos se amplían al máximo y se aprende a sacar partido a toda la potencia de LINQ, que realmente creo que es una revolución en el modo de desarrollar, sobre todo cuando además aparezca Entity Framework.

Respecto a la inferencia que comentas, con 'var' se pueden asignar expresiones complejas, por lo que si haces lo que tú dices obtendrás un error de compilación que te dice que la operación provoca un desbordamiento. Puedes evitarlo usando la expresión unchecked, así:

unchecked
{
var i = int.MaxValue + 1;
Console.WriteLine(i.GetType().ToString());
Console.ReadLine();
}

que te devolvería el tipo como Int32, pero que en este caso concreto contendría un número negativo debido al desbordamiento y al hecho de que de los 32 bits hay uno que se utiliza para el signo.

Lo dicho, mejor sólo usarlo para cosas concretas, como por ejemplo los tipos anónimos que forman la base de LINQ.

Saludos

JM.
Wednesday, January 23, 2008 1:16:39 PM (Hora estándar romance, UTC+01:00)
Hola,

lo del desbordamiento se me escapa.

Entiendo que var declara la variable con el tipo deducido a partir del valor.

Si pongo var i = int.MaxValue + 1; está deduciendo que el tipo será un int, no? Supongo porque interpreta que es una expresión (int + int)

y si pongo var i = 100000000000000; deducirá que el tipo será long ?? o habrá temas de desbordamiento y errores de compilación ?.

Es decir, qué tiene que ser necesario para que utilizando "var" se deduzca el tipo long, o double, etcétera...


Saludos y gracias :-)

espinete
Friday, January 25, 2008 8:41:03 AM (Hora estándar romance, UTC+01:00)
Hola de nuevo:

Si intentas hacer lo del otro día así:

int i = int.MaxValue + 1;

es decir, sin 'var', obtienes el mismo error, y si le pones un 'unchecked' como te comenté, te deja hacerlo y da el mismo problema de desbordamiento y saca un número negativo por el tema del bit de signo. Exactamenteigual que con var.

Si pones var i = 100000000000000 dedicirá automáticamente que es un Long (Int64).
Pero si pones por ejemplo var i = int.MaxValue /2.5; deduce que es un Double por la división.

Lo dicho, yo lo evitaría salvo que no te quede otra, cosa que pasa en LINQ con los tipos anónimos.

saludos

JM.
Name
E-mail
Home page

Comment (Some html is allowed: a@href@title, b, i, strike, strong, u) where the @ means "attribute." For example, you can use <a href="" title=""> or <blockquote cite="Scott">.  

Enter the code shown (prevents robots):

Live Comment Preview
Copyright © 2008 José Manuel Alarcón Aguín. All rights reserved.