O conceito de referência nula surgiu ainda na década de 1960, representando em muitos cenários um recurso bastante útil (sobretudo dentro da Programação Orientada a Objetos – POO).
Contudo, problemas envolvendo a manipulação de referências nulas podem acontecer nas mais variadas plataformas de desenvolvimento de software.
A quantidade de falhas deste tipo e o impacto causado pelas mesmas levou o responsável pela introdução desta técnica (o cientista da computação britânico, Tony Hoare) a cunhar o termo “erro de 1 bilhão de dólares“.
Situações inesperadas e indesejadas deste gênero também são frequentes em soluções implementadas em C#. Dentre as novidades trazidas pela versão 8.0 desta linguagem está um recurso que busca auxiliar os desenvolvedores a evitarem tais ocorrências: trata-se da funcionalidade batizada como Nullable Reference Types.
Supondo um exemplo de implementação como o indicado na listagem a seguir:
using System;
namespace ExemploNullReferenceTypes
{
class Program
{
static void Main()
{
string nomeCompleto = null;
Console.WriteLine(
$"Nome da pessoa: {nomeCompleto.Substring(0, nomeCompleto.IndexOf(' '))}");
}
}
}
Obviamente que ao analisar essa implementação conseguimos determinar rapidamente que a execução do código resultará em uma exceção do tipo NullReferenceException.
Na IDE, porém, nenhum alerta seria gerado (para este caso em específico foi utilizado o Preview 2 do Visual Studio 2019):
Um erro seria então gerado apenas em tempo de execução:
Ao habilitarmos o uso do C# 8.0 (beta) nas propriedades do projeto:
E ativando o uso de Nullable Reference Types no próprio arquivo Program.cs, através da inclusão da instrução #nullable enable:
using System;
#nullable enable
namespace ExemploNullReferenceTypes
{
class Program
{
static void Main()
{
string nomeCompleto = null;
Console.WriteLine(
$"Nome da pessoa: {nomeCompleto.Substring(0, nomeCompleto.IndexOf(' '))}");
}
}
}
Aparecerão agora dois alertas/warnings relativos à atribuição de um valor nulo a uma variável (Converting null literal or possible null value to non-nullable type) e de um possível erro envolvendo a manipulação de uma referência nula (Possible dereference of a null reference):
Tudo isso pode ser resolvido através do uso de Nullable quando da atribuição do valor null à variável nomeCompleto (linha 11), assim como empregando o Null Conditional Operator ao acessar essa referência (linha 13):
using System;
#nullable enable
namespace ExemploNullReferenceTypes
{
class Program
{
static void Main()
{
string? nomeCompleto = null;
Console.WriteLine(
$"Nome da pessoa: {nomeCompleto?.Substring(0, nomeCompleto.IndexOf(' '))}");
}
}
}
Após esses ajustes os alertas não aparecerão mais:
E a aplicação executará sem erros:
Este foi o segundo artigo da série que estou produzindo sobre as novidades do C# 8.0. Caso tenha interesse em consultar o primeiro artigo que publiquei, acesse o link a seguir: