Back-End

19 fev, 2019

Novidades do C# 8.0: Nullable Reference Types

Publicidade

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:

Referências