Back-End

22 abr, 2019

Novidades do C# 8.0: Tuple Patterns

Publicidade

Nova funcionalidade que integra o C# 8.0 e que expande as possibilidades de utilização de Pattern Matching, o recurso conhecido como Tuple Patterns foi concebido com o objetivo de simplificar checagens envolvendo múltiplos valores e empregando também aqui a instrução switch.

Tomando como base o enum Medida, o qual referencia unidades para a medição de alturas (pés, metros):

namespace ExemploTuplePatterns
{
    public enum Medida
    {
        Metros,
        Pes
    }
}

As possibilidades de cálculo envolvendo a transformação de alturas em metros (e vice-versa) estão especificadas na próxima listagem:

using System;

namespace ExemploTuplePatterns
{
    class Program
    {
        private static double ConverterAltura(
            Medida alturaOriginal, Medida alturaResultado, double valor)
        {
            if (alturaOriginal == Medida.Pes && alturaResultado == Medida.Metros)
                return Math.Round(valor * 0.3048, 4);
            else if (alturaOriginal == Medida.Metros && alturaResultado == Medida.Pes)
                return Math.Round(valor * 3.281, 2);
            else
                throw new ArgumentException("Conversão inválida!");
        }

        static void Main()
        {
            double valor;

            valor = 10;
            Console.WriteLine($"Pés: {valor}, " +
                $"Metros: {ConverterAltura(Medida.Pes, Medida.Metros, valor) }");

            valor = 30.48;
            Console.WriteLine($"Metros: {valor}, " +
                $"Pés: {ConverterAltura(Medida.Metros, Medida.Pes, valor) }");

        }
    }
}

Podemos analisar conjuntamente os valores associados aos parâmetros alturaOriginal e alturaResultado, utilizando, para isso, tuplas formadas por tais informações e verificando os conteúdos dessas estruturas por meio de switch. Conseguiremos assim um código mais enxuto, além de manter toda a funcionalidade do exemplo anterior:

using System;

namespace ExemploTuplePatterns
{
    class Program
    {
        private static double ConverterAltura(
            Medida alturaOriginal, Medida alturaResultado, double valor)
        => (alturaOriginal, alturaResultado) switch
        {
            (Medida.Pes, Medida.Metros) => Math.Round(valor * 0.3048, 4),
            (Medida.Metros, Medida.Pes) => Math.Round(valor * 3.281, 2),
            (_, _) => throw new ArgumentException("Conversão inválida!")
        };

        static void Main()
        {
            double valor;

            valor = 10;
            Console.WriteLine($"Pés: {valor}, " +
                $"Metros: {ConverterAltura(Medida.Pes, Medida.Metros, valor) }");

            valor = 30.48;
            Console.WriteLine($"Metros: {valor}, " +
                $"Pés: {ConverterAltura(Medida.Metros, Medida.Pes, valor) }");

        }
    }
}

Ao executar a aplicação de testes correspondentes a este exemplo, teremos como resultado:

Caso queira saber mais sobre outras novidades trazidas pelo C# 8.0, acesse também o artigo a seguir, no qual venho listando todos os conteúdos que produzo sobre essa nova versão da linguagem:

Referências