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:
- Visual Studio 2019 e .NET Core 3: primeiros testes
- Novidades do C# 8.0: como habilitar, Ranges e Indices
- Novidades do C# 8.0: Nullable Reference Types
- Visual Studio 2019: Preview 2.1 e novidades no debugging de Console Applications
- .NET Core 3 Preview 3, VS 2019 Release Candidate, Using Declarations no C# 8.0
- Novidades do C# 8.0: Static Local Functions
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: