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
Pessoacompublic string? Nome { get; set; }. - Criar uma instância com
Nome = null. - Usar
?.Lengthe?? 0para 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
- A classe
Pessoatem a propriedadeNomedo tipostring?, indicando que pode ser nula. - Criamos
pcomNome = null. p.Nome?.Lengthusa o operador de acesso condicional: seNomefor nulo, toda a expressão resulta emnull(umint?).- O operador
?? 0substitui essenullpor0. - Atribuímos
"Carlos"e repetimos o cálculo, agora obtendo6. - 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?.Lengthretornaint?, nãoint. É preciso converter com??ou.Value. - Usar
!em vez de?.:int comprimento = p.Nome!.Length;compila, mas lançaNullReferenceExceptionseNomefor nulo. O!apenas suprime o aviso. - Confundir
?.com.:p.Nome.Lengthlança exceção seNomefor 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