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: