Pular para o conteúdo
.NETNullable e nullable reference types
Módulo 01Fundamentos da Plataforma e da Linguagem

Nullable e nullable reference types

iniciante 22 min de leitura·Atualizado · .NET 9
Resumo

null significa "sem valor". Value types usam int? para poder ser nulos; reference types ganharam os nullable reference types (NRT), que avisam em compilação quando você pode estar acessando algo nulo.

1. Objetivos de Aprendizagem#

  • Usar nullable value types (int?) e seus operadores.
  • Entender nullable reference types (NRT) e seus avisos.
  • Aplicar ?., ?? e ??= para lidar com null com segurança.

2. Pré-requisitos#

  • Struct vs class (tópico 4.1).

3. Conceito#

  • Nullable value types: int? é açúcar para Nullable<int> — permite que um value type seja null (ex.: um campo opcional do banco).
  • Nullable reference types (NRT): com <Nullable>enable</Nullable>, o compilador passa a distinguir string (não deve ser null) de string? (pode ser null) e avisa quando você desreferencia algo possivelmente nulo. É proteção em tempo de compilação contra o NullReferenceException.

Operadores essenciais:

  • ?. — navegação segura: retorna null em vez de estourar.
  • ?? — valor padrão se for null.
  • ??= — atribui só se estiver null.
  • !null-forgiving: "eu garanto que não é null" (use com cautela).

4. Mão na Massa#

4.1. Setup#

Shell
dotnet new console -n Catalog.Nullable
cd Catalog.Nullable

Confirme no .csproj: <Nullable>enable</Nullable>.

4.2. Implementação Passo a Passo#

  1. Nullable value type:
C#
int? desconto = null;
int aplicado = desconto ?? 0;   // 0 se null
if (desconto.HasValue)
    Console.WriteLine(desconto.Value);
  1. NRT e operadores:
C#
string? nome = ObterNome();          // pode ser null
int tamanho = nome?.Length ?? 0;     // seguro
nome ??= "sem nome";                 // define padrão se null
Console.WriteLine(nome.Length);      // agora garantido não-nulo

static string? ObterNome() => null;

4.3. Executando#

Shell
dotnet run

5. Exemplo Completo#

C#
string? entrada = null;
var nome = entrada?.Trim() ?? "anônimo";
Console.WriteLine($"Olá, {nome}");   // "Olá, anônimo"

6. Boas Práticas e Armadilhas#

FaçaEvite
Manter Nullable habilitado e tratar os avisosSilenciar avisos com ! em todo lugar
Usar ?? para valores padrãoAcessar propriedades sem checar null antes
Declarar string? quando o null é legítimoFingir que algo nunca é null quando pode ser
Atenção

o operador ! (null-forgiving) não verifica nada em runtime — apenas silencia o compilador. Se você errar, o NullReferenceException volta.

7. Segurança e Produção#

  • NRT reduz drasticamente uma das exceções mais comuns em produção (NullReferenceException). Trate os avisos como parte da qualidade do código.

8. Exercícios#

  • Fácil: use ?? para dar um padrão a um string?.
  • Médio: encadeie ?. para acessar propriedade de um objeto possivelmente nulo.
  • Desafio: habilite TreatWarningsAsErrors e resolva todos os avisos de nullability de um projeto pequeno.

9. Resumo#

int? permite value types nulos; NRT avisa em compilação sobre acessos possivelmente nulos. Use ?., ?? e ??= para tratar null com segurança e evite abusar do !.

10. Próximos Passos#

Encerramos os fundamentos de tipos. A seguir, orientação a objetos.

11. Referências#

04-03 — Nullable e nullable reference types | Curso ASP.NET Core