22 de abril de 2010

Nullable Types en C#

Los “Nullable Types” son tipos especiales de datos que permite que los tipos bases de .Net se puedan comportar como si fueran 'clases', o sea, no es otra cosa que permitir que un int (por ejemplo) permita también almacenar valores nulos.

int? a = 1;
int? b = null;

Nota:
En realidad un Nullable Type es una struct (estructura) por lo cual sigue siendo un tipo por valor y no por referencia. Más adelante veremos un ejemplo de esto.

Al ser una estructura posee un grupo de propiedades que podemos aprovechar. Por ejemplo, muchas veces me he encontrado código escrito de la siguiente manera (o alguna otra parecida):

int b = (a != null) ? Convert.ToInt32(a) : 0;

Nótese que en el código estamos convirtiendo la variable a (que es de tipo int?) a tipo entero (int Convert.ToInt32), de lo contrario el proyecto NO compilaría. Pero sabemos que a es de tipo nullable y por ende una estructura (struc) con ciertas propiedades que podríamos usar:

//Cualquiera de estas 2 variantes
int b = (a != null) ? a.Value : 0;
int b = (a.HasValue) ? a.Value : 0;

De esta forma nos estaríamos ahorrando la conversión a entero.

 

Nullable Type ¿Es una clase o estructura? ¿class or struct?

La mejor manera de comprobarlo, es mediante un ejemplo y chequeando los resultados. Antes debemos de partir de una de las principales diferencias entre clases y estructuras:

  • Las clases (class) son tipos por referencia.
  • Las estructuras (struc) son tipos por valor.
static void Main(string[] args)
{
  int? a = 1;
  int b = (a.HasValue) ? a.Value : 0;
 
  TestTypeNullable(a, ref b);
}
 
private static void TestTypeNullable(int? a, ref int b)
{
  a++;
  b++;
}

Types Nullables

La imagen muestra los valores de las variables a y b, después de ejecutar el método TestTypeNullable.

En las 2 primeras líneas, a = b = 1. Después llamamos al método pasándole a (por valor) y b (por referencia).

Como vemos, a mantiene el valor original (1) lo que demuestra que fue 'pasado' por valor; y como ya sabemos las clases son tipos por referencia, por ende a es una estructura (struct) y podemos llegar a la conclusión de que los tipos anulables son estructuras (struct).

 

Artículos Relacionados:

No hay comentarios:

Publicar un comentario