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: