Back-End

24 abr, 2019

Novidades do C# 8.0: Property Patterns

Publicidade

Em artigos anteriores sobre o C# 8.0, abordei novidades relativas ao uso de Pattern Matching, com exemplos práticos baseados em Switch Expressions e Tuple Patterns:

Neste novo artigo retomo esse trabalho, apresentando, desta vez, a opção batizada como Property Patterns. Essa alternativa simplifica a codificação de expressões envolvendo a análise dos possíveis valores para uma propriedade em um objeto.

Observação: para realizar os testes aqui descritos utilizei o Preview 4 do .NET Core 3.0, além do update 16.1.0 do Visual Studio 2019 Preview.

Aproveito este espaço para deixar um convite:

Amanhã (25), às 21:30, horário de Brasília, teremos mais um evento online gratuito no Canal .NET. Desta vez o MVP Luiz Carlos Faria fará uma apresentação sobre o uso de containers Docker como meio para simplificar a montagem de ambientes de desenvolvimento.

Para efetuar sua inscrição acesse a página do evento no Meetup. A transmissão acontecerá via YouTube, em um link a ser divulgado em breve.

O projeto criado foi ajustado para utilizar o C# 8.0. Acesse, para isto, Properties > Build > Advanced e escolha “unsupported preview of next C# version” ou C# 8.0 (beta):

Considerando a classe Passagem:

namespace ExemploPropertyPatterns
{
    public class Passagem
    {
        public string SiglaRegiao { get; set; }
        public double PrecoBase { get; set; }
    }
}

E a listagem a seguir, em que o método AplicarAdicional será utilizado no cálculo do preço final de uma passagem (com as verificações empregando uma combinação de switch e case):

using System;

namespace ExemploPropertyPatterns
{
    class Program
    {
        private static double AplicarAdicional(Passagem passagem)
        {
            switch (passagem.SiglaRegiao)
            {
                case "N":
                    return passagem.PrecoBase * 1.5;
                case "NE":
                    return passagem.PrecoBase * 1.4;
                case "CO":
                    return passagem.PrecoBase * 1.3;
                case "S":
                    return passagem.PrecoBase * 1.1;
                default:
                    return passagem.PrecoBase;
            }
        }

        static void Main()
        {
            Passagem p1 = new Passagem() { SiglaRegiao = "NE", PrecoBase = 200.0 };
            Console.WriteLine($"Passagem 1 - Região: {p1.SiglaRegiao}, " +
                $"Preço Base: {p1.PrecoBase}, Preço Final: " + AplicarAdicional(p1));

            Passagem p2 = new Passagem() { SiglaRegiao = "SE", PrecoBase = 50.0 };
            Console.WriteLine($"Passagem 2 - Região: {p2.SiglaRegiao}, " +
                $"Preço Base: {p2.PrecoBase}, Preço Final: " + AplicarAdicional(p2));
        }
    }
}

Utilizando Property Patterns este código ficará muito mais simplificado, conforme detalhado na próxima listagem (em que consta uma versão refatorada do método AplicarAdicional):

  • Foi dispensado o uso de case, com o objeto a ser analisado seguido por switch
  • Os valores possíveis da propriedade SiglaRegiao estão entre chaves ({ e }), com as expressões de retorno precedidas por =>
  • O uso da palavra-chave default foi substituído por _.
using System;

namespace ExemploPropertyPatterns
{
    class Program
    {
        private static double AplicarAdicional(Passagem passagem) =>
            passagem switch
            {
                { SiglaRegiao: "N" } => passagem.PrecoBase * 1.5,
                { SiglaRegiao: "NE" } => passagem.PrecoBase * 1.4,
                { SiglaRegiao: "CO" } => passagem.PrecoBase * 1.3,
                { SiglaRegiao: "S" } => passagem.PrecoBase * 1.1,
                _ => passagem.PrecoBase
            };

        static void Main()
        {
            Passagem p1 = new Passagem() { SiglaRegiao = "NE", PrecoBase = 200.0 };
            Console.WriteLine($"Passagem 1 - Região: {p1.SiglaRegiao}, " +
                $"Preço Base: {p1.PrecoBase}, Preço Final: " + AplicarAdicional(p1));

            Passagem p2 = new Passagem() { SiglaRegiao = "SE", PrecoBase = 50.0 };
            Console.WriteLine($"Passagem 2 - Região: {p2.SiglaRegiao}, " +
                $"Preço Base: {p2.PrecoBase}, Preço Final: " + AplicarAdicional(p2));
        }
    }
}

A execução dessa aplicação de testes terá como resultado:

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

Referências