Back-End

29 mar, 2019

Novidades do C# 8.0: Switch Expressions

Publicidade

Uma das novidades trazidas pelo C# 7.0 foi o recurso conhecido como Pattern Matching, funcionalidade concebida com o intuito de eliminar a necessidade de codificação de um typecast e contribuir, assim, para a obtenção de um código mais limpo e direto. Já abordei isso no seguinte artigo:

O C# 7.1 ampliou as possibilidades envolvendo Pattern Matching, ao suportar também o uso de tipos genéricos com essa funcionalidade. Também apresentei no artigo a seguir essa novidade em detalhes:

Já o C# 8.0 expandiu ainda mais o escopo de utilização no que se refere a Pattern Matching, sendo possível destacar agora a introdução das switch expressions.

Observação: para os testes descritos neste artigo, foram utilizados o Visual Studio 2019 Preview 4.3 e o .NET Core 3.0 Preview 3.

Supondo um bloco de código como o apresentado na listagem a seguir (com o enum FiguraGeometrica e a classe estática Area), em que se faz uso das instruções switch, case e default dentro de um método:

using System;

namespace ExemploSwitchExpressions
{
    public enum FiguraGeometrica
    {
        Quadrado,
        Retangulo,
        Triangulo
    }

    public static class Area
    {
        public static double Calcular(
            FiguraGeometrica figura, double medida1, double? medida2 = null)
        {
            switch (figura)
            {
                case FiguraGeometrica.Quadrado:
                    return medida1 * medida1;
                case FiguraGeometrica.Retangulo:
                    return medida1 * medida2.Value;
                case FiguraGeometrica.Triangulo:
                    return (medida1 * medida2.Value) / 2.0;
                default:
                    throw new ArgumentException("Figura Geométrica inválida!");
            }
        }
    }
}

Empregando switch expressions este código ficará bem mais simplificado, conforme observado na próxima listagem (em que consta uma versão refatorada do tipo Area):

  • Foi dispensado o uso de case, com o valor a ser analisado seguido por => e pela expressão de retorno
  • O uso da palavra-chave default foi substituído por _
using System;

namespace ExemploSwitchExpressions
{
    public enum FiguraGeometrica
    {
        Quadrado,
        Retangulo,
        Triangulo
    }

    public static class Area
    {
        public static double Calcular(
            FiguraGeometrica figura, double medida1, double? medida2 = null) =>
        figura switch
        {
            FiguraGeometrica.Quadrado => medida1 * medida1,
            FiguraGeometrica.Retangulo => medida1 * medida2.Value,
            FiguraGeometrica.Triangulo => (medida1 * medida2.Value) / 2.0,
            _ => throw new ArgumentException("Figura Geométrica inválida!")
        };
    }
}

A listagem a seguir traz um exemplo de uso da classe Area e do enum FiguraGeometrica:

using System;

namespace ExemploSwitchExpressions
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Área de um quadrado de lado 4: " +
                Area.Calcular(FiguraGeometrica.Quadrado, 4));
            Console.WriteLine("Área de um retângulo de 5 x 6: " +
                Area.Calcular(FiguraGeometrica.Retangulo, 5, 6));
            Console.WriteLine("Área de um triângulo de base 7 e altura 8: " +
                Area.Calcular(FiguraGeometrica.Triangulo, 7, 8));
        }
    }
}

Como resultado da execução desta aplicação, teremos:

Deixo aqui os links com os demais artigos que já publiquei sobre as novidades do C# 8.0 e do Visual Studio 2019:

E também a gravação do hangout que aconteceu dia 06/03 no Canal .NET, na qual abordei novidades envolvendo o .NET Core 2.2, o ASP.NET Core 2.2, o .NET Core 3.0, o ASP.NET Core 3.0 e o Visual Studio 2019:

Referências