csharp-tipos-nullables

Tipos Nullables en C#

Un tipo nullable es una extensión de los tipos de valor que permite que estos tipos puedan representar el valor null, además de sus valores normales. Esto es útil en escenarios donde un valor puede ser opcional o no siempre está disponible.

En C#, el valor null se utiliza para representar una ausencia de valor o referencia. Sin embargo, los tipos de valor (como int, double, bool) no pueden ser null por defecto, ya que siempre tienen un valor predeterminado.

Para abordar esta limitación, C# introduce los tipos nullables, permitiendo que los tipos de valor puedan tener el valor null.

Declaración y uso de tipos nullables

Para declarar un tipo nullable, se usa el operador ? después del tipo de valor. Por ejemplo, int? es un tipo nullable que puede contener un entero o null.

La sintaxis para declarar un tipo nullable es simple. Por ejemplo,

int? edad = null;
double? salario = 4500.50;
bool? esActivo = null;

Aquí, numero es una variable que puede contener un entero o el valor null.

Tipos Nullables y la Estructura Nullable<T>

Bajo el capó, la sintaxis anterior utiliza la estructura genérica Nullable<T>. Por ejemplo:

Nullable<int> miNumero = null;

Ambas formas (Nullable<T> y T?) son equivalentes, pero el uso del operador ? es más común y más sencillo de leer.

Comprobación de Nulidad

Para verificar si un tipo nullable tiene un valor o es nulo, puedes usar las propiedades HasValue y Value. La propiedad HasValue indica si el tipo nullable contiene un valor:

if (edad.HasValue)
{
    Console.WriteLine($"La edad es {edad.Value}");
}
else
{
    Console.WriteLine("La edad no está asignada.");
}

Asignación de Valor Predeterminado

El operador de coalescencia nula ?? proporciona una forma compacta de manejar los valores nullables, permitiendo definir un valor predeterminado en caso de que el nullable sea null.

int? numero = null;
int resultado = numero ?? 5;

Console.WriteLine(resultado); // Imprime 5

En este caso, si numero es null, resultado tomará el valor 5. Si numero tiene un valor, resultado será igual a numero.

Conversión entre Tipos Nullables y Tipos No Nullables

Si necesitas convertir un tipo nullable a un tipo no nullable, puedes usar la propiedad Value:

int edadNoNullable = edad.Value; // Asegúrate de que edad no es null antes de acceder a Value.

Tipos nullables y operaciones

Cuando se trabaja con tipos nullables, es importante entender cómo se comportan en las operaciones aritméticas y lógicas.

Operaciones aritméticas

Las operaciones aritméticas con tipos nullables siguen reglas específicas: si cualquiera de los operandos es null, el resultado también es null.

int? a = 10;
int? b = null;
int? suma = a + b;

Console.WriteLine(suma.HasValue ? suma.Value.ToString() : "null"); // Imprime null

Aquí, debido a que b es null, la suma resulta en null.

Comparaciones

Las comparaciones con tipos nullables son posibles, pero el resultado puede ser null si alguno de los operandos es null.

int? x = 10;
int? y = null;

bool? esMayor = x > y;

Console.WriteLine(esMayor.HasValue ? esMayor.Value.ToString() : "null"); // Imprime null

En este caso, esMayor es null porque y es null.

Mejoras en C# 8.0 y Versiones Posteriores

A partir de C# 8.0, se introdujo la capacidad de distinguir entre tipos nullables y tipos no nullables en el sistema de tipos del lenguaje.

Esto significa que puedes marcar un tipo como “nullable” y el compilador te advertirá si intentas asignar un valor nulo a un tipo que no debería aceptar nulos.

#nullable enable

public class Persona
{
    public string Nombre { get; set; }    // No puede ser nulo
    public string? Apellido { get; set; } // Puede ser nulo
}