Operador condicional de nulo
Acesso seguro com ?..
Operador condicional de nulo é uma aula grátis de C# Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C# Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C# Academy inclui 4 aulas no total.
O problema das cadeias nulas
Acessar um membro de uma referência null lança uma NullReferenceException. Essa é uma das falhas mais comuns em tempo de execução no C#.
Ao encadear chamadas como user.Address.City, qualquer elo da cadeia pode ser nulo, e a solução antiga era uma sequência enorme de verificações com if.
Conheça o ?.
O operador condicional nulo ?. interrompe a avaliação de toda a expressão. Se o lado esquerdo for null, o resultado será null em vez de uma exceção.
Ele pode ser entendido assim: "acesse este membro, mas somente se o objeto não for nulo".
string name = null;
int? length = name?.Length;
System.Console.WriteLine(length == null);O resultado se torna anulável
Como ?. pode produzir null, o tipo do resultado se torna anulável. name?.Length é int?, não int.
Por isso, você deve armazená-lo em um int?, e não em um int simples.
string text = "hello";
int? len = text?.Length;
System.Console.WriteLine(len);Um exemplo executável
Este programa mostra ?. retornando um valor quando o objeto existe e null quando ele não existe.
Execute-o e observe que nenhuma exceção é lançada.
using System;
class Program
{
static void Main()
{
string a = "world";
string b = null;
Console.WriteLine(a?.ToUpper());
Console.WriteLine(b?.ToUpper() ?? "(null)");
}
}Encadeando vários ?.
Você pode encadear ?. em vários membros. Assim que qualquer parte for null, toda a cadeia é interrompida e retorna null.
Portanto, customer?.Order?.Total é seguro mesmo que customer ou Order seja nulo.
string s = null;
int? upperLen = s?.ToUpper()?.Length;
System.Console.WriteLine(upperLen == null);Indexador condicional de nulo ?[]
Existe uma forma de indexador, ?[], para matrizes e listas. Se a coleção for null, o acesso pelo índice retorna null em vez de causar uma falha.
Observação: ele protege contra uma coleção nula, mas não contra um índice fora dos limites.
int[] data = null;
int? first = data?[0];
System.Console.WriteLine(first == null);Chamando métodos com segurança
?. também protege chamadas de métodos. list?.Clear() chama Clear somente se list não for nulo; caso contrário, não faz nada.
Para um método que retorna void, toda a instrução simplesmente não faz nada quando o valor é nulo.
System.Collections.Generic.List<int> list = null;
list?.Add(5);
System.Console.WriteLine("No crash");Disparo de eventos seguro para execução concorrente
Um uso clássico é disparar eventos. SomeEvent?.Invoke(this, args) dispara o evento com segurança somente quando há pelo menos um manipulador inscrito.
Isso substituiu o antigo padrão de verificar se o valor era nulo, que poderia apresentar uma condição de corrida entre a verificação e a chamada.
System.Action handler = null;
handler?.Invoke();
System.Console.WriteLine("Invoked safely");Combinando com ??
?. combina naturalmente com o operador de coalescência nula ?? para fornecer um valor alternativo quando a cadeia for nula.
name?.Length ?? 0 fornece o comprimento ou 0 se name for nulo.
string name = null;
int length = name?.Length ?? 0;
System.Console.WriteLine(length);Uma armadilha sutil
Mesmo quando o tipo de valor final não é anulável, usar ?. torna a expressão anulável. list?.Count é int?, não int.
Se precisar de um int simples, acrescente ?? 0 ou use GetValueOrDefault().
var list = new System.Collections.Generic.List<int> { 1, 2 };
int count = list?.Count ?? 0;
System.Console.WriteLine(count);Comparação completa
Este programa compara a abordagem detalhada com if à versão concisa com ?.. Ambas evitam a exceção, mas ?. é muito mais simples.
using System;
class Program
{
static void Main()
{
string s = null;
int len = s != null ? s.Length : -1;
Console.WriteLine(len);
Console.WriteLine(s?.Length ?? -1);
}
}Verificação rápida
Teste sua compreensão do operador condicional nulo.
Recapitulação
O operador condicional nulo ?. (e o indexador ?[]) interrompe o acesso a um membro quando o objeto é null, retornando null em vez de lançar uma exceção.
O resultado se torna anulável, portanto combine-o com ?? para fornecer um valor alternativo.
Perguntas Frequentes
A aula “Operador condicional de nulo” é grátis?
Sim — o texto completo de “Operador condicional de nulo” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C# Academy, atualize para CoddyKit PRO. O curso de C# Academy inclui 4 aulas no total.
O que vou aprender em “Operador condicional de nulo”?
Acesso seguro com ?.. Você pratica C# Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar C# Academy?
Nenhuma experiência prévia é necessária. C# Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “Operador condicional de nulo”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de C# Academy?
Sim. Cada aula de C# Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Tipos de valores anuláveis
- Operador condicional de nulo
- Operadores de coalescência de nulo
- Protegendo contra nulos