Esse é o primeiro post de uma série onde serão abordadas as novas funcionalidades da versão 8 do C#.
Começaremos por uma funcionalidade chamada Nullable Reference Types, que permite ao desenvolvedor evitar os conhecidos NullReferenceException. Esse tipo de erro ocorre quando tentamos acessar um membro em um tipo cujo valor é null ou sem instanciar o objeto previamente.
Esse problema pode aparecer por descuido ou inexperiência na linguagem, mas agora podemos identificar esse problema durante a codificação e não mais na hora de testar ou pior, em alguns casos, em produção.
Abaixo temos os principais métodos deste exemplo. O código completo pode ser baixado aqui.
public static string ExibirDadosAluno(Aluno aluno)
{
return
$"Nome: {aluno.Nome}
Sobrenome: {aluno.Sobrenome[0]}.,
Idade: {aluno.Idade}";
}
public static IEnumerable<string> ListarAlunos(IList<Aluno> alunos)
{
foreach (var aluno in alunos)
{
yield return ExibirDadosAluno(aluno);
}
}
O método ListarAlunos itera sobre uma coleção e exibe os dados de cada um dos alunos no formato {Nome} {S.}, {Idade}. Ex.: Fernando F., 38.
Para exibir apenas a primeira letra do sobrenome, utilizamos a sintaxe aluno.Sobrenome[0]. Ao executar esse código, teremos o erro da figura abaixo, pois estamos tentando acessar um valor null.

O contexo #nullable
Agora podemos dizer ao compilador que estamos trabalhando com tipos que podem ser null e deixar que ele nos alerte sobre potenciais problemas. Para isso vamos submeter nosso código a um contexto de tipos anuláveis. Para fazer isso, basta inserir #nullable enable no início do arquivo.

Para fins didáticos, a classe Aluno – Imagem 3 – foi deixada no arquivo principal, portanto esta também faz parte do contexto, que verifica o arquivo completo em busca de inconsistências.
A parte legal começa agora, podemos notar que o construtor está sinalizado por um alerta, informando que há um membro não inicializado que este poderá causar problemas no futuro.

P.S. Por se tratar de um alerta, este também também aparece na janela de erros (Error List).
Vamos inicializar esta propriedade e ver como se comportará nosso código.

Nesse caso estamos associando um null para um tipo que não aceita este valor. Agora marcaremos a propriedade “Sobrenome” com o símbolo “?” para que esta possa receber null, conforme imagem abaixo:

Note que após os devidos ajustes terem sido feitos, ainda temos um alerta para tratar no método ExibirDadosAluno.

Esse alerta informa uma possível “desreferência” de null, ou seja, o compilador está nos avisando que em algum momento a referência desta propriedade pode se tornar null. Neste caso, basta que façamos um tratamento condicional no retorno do método.

Assim podemos evitar aqueles bugs bobos e indesejados que podem nos trazer muita dor de cabeça, pois quando eles ocorrem, são nos piores momentos.
É possível também configurar a verificação de tipos nulos para todo o projeto, para isso é preciso adicionar a linha destacada no arquivo “.csproj”, conforme a imagem 9.

O operador “!”
Este operador serve para dizer ao compilador que você tem certeza do que está fazendo. O que isso significa? Significa que quando você receber um alerta de uma possível “desreferência” – situação em que o retorno poderá ser null e sem um tratamento adequado – e você quiser inibir este alerta, basta colocar o operador “!” – sem aspas – imediatamente após a propriedade e/ou campo que retornará o valor.

Lembre-se que maiores poderes carregam consigo maiores responsabilidades!