Start Debugging

Asignación condicional nula en C# 14: usar ?. y ?[] en el lado izquierdo

C# 14 extiende los operadores condicionales nulos para que funcionen en el lado izquierdo de las asignaciones, eliminando verificaciones de null verbosas al asignar propiedades o indexadores.

C# 14 trae un cambio pequeño pero impactante: los operadores condicionales nulos ?. y ?[] ahora funcionan en el lado izquierdo de las asignaciones. Esto elimina un patrón común de envolver asignaciones de propiedades en verificaciones de null.

El patrón verboso que reemplaza

Antes de C# 14, asignar a una propiedad solo cuando un objeto no es null requería verificaciones explícitas:

if (customer is not null)
{
    customer.LastOrderDate = DateTime.UtcNow;
}

if (settings is not null)
{
    settings["theme"] = "dark";
}

Con objetos profundamente anidados, esto se volvía peor:

if (order?.Customer?.Address is not null)
{
    order.Customer.Address.IsVerified = true;
}

Asignación condicional nula en C# 14

C# 14 te permite escribir la misma lógica de forma más concisa:

customer?.LastOrderDate = DateTime.UtcNow;

settings?["theme"] = "dark";

order?.Customer?.Address?.IsVerified = true;

La asignación solo se ejecuta si el lado izquierdo evalúa a una referencia no nula. El lado derecho nunca se evalúa cuando el destino es null.

Cómo funciona

La expresión P?.A = B es equivalente a:

if (P is not null)
{
    P.A = B;
}

Con una diferencia importante: P se evalúa solo una vez. Esto importa cuando P es una llamada a método o tiene efectos secundarios.

Operadores de asignación compuesta

La asignación condicional nula también funciona con operadores compuestos como +=, -=, *= y otros:

inventory?.StockLevel += restockAmount;

counter?.Value -= 1;

account?.Balance *= interestRate;

Cada uno de estos evalúa el lado izquierdo una sola vez y aplica la operación solo si el destino no es null.

Incremento y decremento no se permiten

Una limitación: los operadores ++ y -- no se pueden usar con la asignación condicional nula. Esto no compila:

// Error: ++ and -- not allowed
counter?.Value++;

Usa la asignación compuesta en su lugar:

counter?.Value += 1;

Ejemplo práctico: manejadores de eventos

Un caso de uso común es asignar manejadores de eventos de forma condicional:

public void Initialize(Button? submitButton, Button? cancelButton)
{
    submitButton?.Click += OnSubmit;
    cancelButton?.Click += OnCancel;
}

Sin la asignación condicional nula, necesitarías verificaciones de null separadas para cada botón.

Encadenamiento con indexadores

El operador ?[] funciona de la misma manera para asignaciones de indexadores:

Dictionary<string, string>? headers = GetHeaders();

headers?["Authorization"] = $"Bearer {token}";
headers?["Content-Type"] = "application/json";

Si headers es null, ninguna asignación se ejecuta y no se lanza ninguna excepción.

Cuándo usarlo

La asignación condicional nula funciona mejor cuando:

La característica está disponible en .NET 10 con C# 14. Configura <LangVersion>14</LangVersion> en tu archivo de proyecto para habilitarla.

Para la especificación completa, consulta Asignación condicional nula en Microsoft Learn.

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< Volver