C# Tipos Básico
Tipos anuláveis
Em C#, tipos por valor (como int, bool, double) normalmente não aceitam null. Para representar a ausência de valor, usamos tipos anuláveis com a sintaxe T?. Por exemplo, int? pode conter um número inteiro ou null.
Com nullable reference types (a partir do C# 8), tipos por referência (como string) também podem ser anotados com ? para indicar que podem ser nulos. O compilador passa a emitir avisos quando você desreferencia algo que pode ser nulo, ajudando a evitar NullReferenceException.
Para lidar com valores anuláveis, usamos operadores como ?. (acesso condicional) e ?? (operador de coalescência nula). O ?. só acessa o membro se o objeto não for nulo; o ?? fornece um valor padrão caso a expressão à esquerda seja nula.
Quando você tem certeza de que um valor não é nulo, pode usar o operador ! (null-forgiving) para suprimir avisos do compilador. Use com moderação: ele apenas silencia o aviso, não impede um NullReferenceException em tempo de execução.
Pontos-chave
int?é umNullable<int>e pode recebernull.- Nullable reference types (
string?) habilitam avisos do compilador sobre possíveis nulos. ?.evitaNullReferenceExceptionao acessar membros de um objeto que pode ser nulo.??retorna o valor à esquerda se não for nulo, senão o valor à direita.!suprime avisos de nulidade, mas não torna o valor não nulo em tempo de execução.
using System;
class Program
{
static void Main()
{
// Tipo anulável por valor
int? idade = null;
Console.WriteLine(idade.HasValue ? $"Idade: {idade.Value}" : "Idade não informada");
idade = 30;
Console.WriteLine($"Idade: {idade.Value}");
// Nullable reference type
string? nome = null;
// Operador de acesso condicional
Console.WriteLine($"Tamanho do nome: {nome?.Length ?? 0}");
nome = "Ana";
Console.WriteLine($"Tamanho do nome: {nome?.Length ?? 0}");
// Operador null-forgiving (use com cuidado)
string? apelido = null;
// Console.WriteLine(apelido!.Length); // Lançaria NullReferenceException
Console.WriteLine(apelido?.Length ?? -1);
}
}