Da trilha de C# Este conceito ainda não saiu como card do dia. ir para o card de hoje

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? é um Nullable<int> e pode receber null.
  • Nullable reference types (string?) habilitam avisos do compilador sobre possíveis nulos.
  • ?. evita NullReferenceException ao 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.
NullableTypes.cs
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);
    }
}

Exercícios

  1. 1
    Fácil

    Verificando idade nula

    Crie um programa que declare uma variável int? idade = null. Use HasValue para verificar se ela tem valor. Se tiver, imprima "Idade: X"; senão, imprima "Idade não informada". Depois, atribua 25 e imprima novamente.

    Resolver
  2. 2
    Médio

    Acesso seguro com ?. e ??

    Dada uma classe Pessoa com propriedade string? Nome, crie um objeto Pessoa com Nome = null. Imprima o comprimento do nome usando ?. e ?? para evitar exceção e mostrar 0 quando nulo. Depois, atribua "Carlos" e imprima novamente.

    Resolver
  3. 3
    Desafio

    Null-forgiving e avisos do compilador

    Crie um método ObterNome() que retorna string?. No Main, chame esse método e use o operador ! para suprimir o aviso de possível nulo ao acessar .Length. Imprima o comprimento. Em seguida, modifique o método para retornar null e mostre o que acontece se você usar ! sem verificar (comente a linha que causa exceção).

    Resolver

Continue estudando