Start Debugging

Atribuição condicional nula em C# 14: usando ?. e ?[] no lado esquerdo

C# 14 estende os operadores condicionais nulos para funcionarem no lado esquerdo de atribuições, eliminando verificações de null verbosas ao definir propriedades ou indexadores.

C# 14 traz uma mudança pequena mas impactante: os operadores condicionais nulos ?. e ?[] agora funcionam no lado esquerdo de atribuições. Isso elimina um padrão comum de envolver atribuições de propriedades em verificações de null.

O padrão verboso que ele substitui

Antes do C# 14, atribuir a uma propriedade somente quando um objeto não é null exigia verificações explícitas:

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

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

Com objetos profundamente aninhados, isso ficava pior:

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

Atribuição condicional nula em C# 14

C# 14 permite que você escreva a mesma lógica de forma mais concisa:

customer?.LastOrderDate = DateTime.UtcNow;

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

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

A atribuição só é executada se o lado esquerdo avaliar para uma referência não nula. O lado direito nunca é avaliado quando o destino é null.

Como funciona

A expressão P?.A = B é equivalente a:

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

Com uma diferença importante: P é avaliado apenas uma vez. Isso importa quando P é uma chamada de método ou tem efeitos colaterais.

Operadores de atribuição composta

A atribuição condicional nula também funciona com operadores compostos como +=, -=, *= e outros:

inventory?.StockLevel += restockAmount;

counter?.Value -= 1;

account?.Balance *= interestRate;

Cada um deles avalia o lado esquerdo uma vez e aplica a operação somente se o destino não for null.

Incremento e decremento não são permitidos

Uma limitação: os operadores ++ e -- não podem ser usados com atribuição condicional nula. Isso não compila:

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

Use atribuição composta no lugar:

counter?.Value += 1;

Exemplo prático: manipuladores de eventos

Um caso de uso comum é definir manipuladores de eventos condicionalmente:

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

Sem a atribuição condicional nula, você precisaria de verificações de null separadas para cada botão.

Encadeamento com indexadores

O operador ?[] funciona da mesma forma para atribuições de indexadores:

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

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

Se headers for null, nenhuma das atribuições é executada e nenhuma exceção é lançada.

Quando usar

A atribuição condicional nula funciona melhor quando:

O recurso está disponível no .NET 10 com C# 14. Defina <LangVersion>14</LangVersion> no arquivo do seu projeto para habilitá-lo.

Para a especificação completa, consulte Atribuição condicional nula no Microsoft Learn.

Comments

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

< Voltar