Médio C#

Acesso seguro com ?. e ??

Enunciado

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.

Requisitos

  • Definir a classe Pessoa com public string? Nome { get; set; }.
  • Criar uma instância com Nome = null.
  • Usar ?.Length e ?? 0 para obter o comprimento.
  • Imprimir o comprimento resultante.

Código inicial

using System;

class Pessoa
{
    public string? Nome { get; set; }
}

class Program
{
    static void Main()
    {
        // Seu código aqui
    }
}

Saída esperada

Comprimento: 0
Comprimento: 6
Ver dica

pessoa.Nome?.Length retorna int?. Use ?? 0 para obter um int não nulo.

Mostrar solução
using System;

class Pessoa
{
    public string? Nome { get; set; } // referência anulável
}

class Program
{
    static void Main()
    {
        var p = new Pessoa { Nome = null };
        // ?. evita NullReferenceException; ?? fornece valor padrão
        int comprimento = p.Nome?.Length ?? 0;
        Console.WriteLine($"Comprimento: {comprimento}");

        p.Nome = "Carlos";
        comprimento = p.Nome?.Length ?? 0;
        Console.WriteLine($"Comprimento: {comprimento}");
    }
}

Passo a passo

  1. A classe Pessoa tem a propriedade Nome do tipo string?, indicando que pode ser nula.
  2. Criamos p com Nome = null.
  3. p.Nome?.Length usa o operador de acesso condicional: se Nome for nulo, toda a expressão resulta em null (um int?).
  4. O operador ?? 0 substitui esse null por 0.
  5. Atribuímos "Carlos" e repetimos o cálculo, agora obtendo 6.
  6. Imprimimos os resultados.

Por que funciona

O ?. interrompe a avaliação e retorna null se o operando à esquerda for nulo, evitando acessar .Length em null. O ?? então fornece um valor padrão. Juntos, eles permitem escrever código seguro e conciso para lidar com possíveis nulos.

Erros comuns

  • Esquecer o ??: int comprimento = p.Nome?.Length; não compila, pois ?.Length retorna int?, não int. É preciso converter com ?? ou .Value.
  • Usar ! em vez de ?.: int comprimento = p.Nome!.Length; compila, mas lança NullReferenceException se Nome for nulo. O ! apenas suprime o aviso.
  • Confundir ?. com .: p.Nome.Length lança exceção se Nome for nulo.

Outra forma de resolver

Usando if tradicional:

int comprimento = 0;
if (p.Nome != null)
    comprimento = p.Nome.Length;

Ou com string.IsNullOrEmpty:

int comprimento = string.IsNullOrEmpty(p.Nome) ? 0 : p.Nome.Length;

Saída esperada

Comprimento: 0
Comprimento: 6