Pattern Matching
O Pattern Matching em C# é uma funcionalidade poderosa que permite aos desenvolvedores verificar tipos de objetos e extrair informações de acordo com sua estrutura em tempo de execução. Introduzido a partir do C# 7.0 e aprimorado nas versões posteriores, o Pattern Matching melhora significativamente a legibilidade do código e reduz a necessidade de conversões manuais de tipos, tornando o código mais seguro e menos propenso a erros.
O Pattern Matching é essencial quando trabalhamos com coleções heterogêneas, estruturas de dados complexas ou modelos orientados a objetos, permitindo tomar decisões baseadas no tipo ou nas propriedades de um objeto sem recorrer a múltiplos if-else aninhados. Ele integra conceitos fundamentais do C# como sintaxe, estruturas de dados, algoritmos e princípios de orientação a objetos.
Neste tutorial, o leitor aprenderá a utilizar Pattern Matching para simplificar a lógica de decisão, melhorar a manutenção do código e otimizar algoritmos. Também serão abordadas práticas recomendadas, como o uso de expressões switch, padrões de propriedades e de tupla, e como evitar armadilhas comuns como vazamentos de memória e tratamento inadequado de erros. Ao final, o desenvolvedor será capaz de aplicar Pattern Matching em projetos reais de C#, garantindo código mais limpo, eficiente e seguro dentro da arquitetura de software e desenvolvimento de back-end.
Exemplo Básico
textusing System;
namespace PatternMatchingExample
{
public class Shape {}
public class Circle : Shape
{
public double Radius { get; }
public Circle(double radius) => Radius = radius;
}
public class Rectangle : Shape
{
public double Width { get; }
public double Height { get; }
public Rectangle(double width, double height) => (Width, Height) = (width, height);
}
class Program
{
static void Main(string[] args)
{
Shape shape = new Circle(5.0);
string result = shape switch
{
Circle c => $"Raio do círculo: {c.Radius}",
Rectangle r => $"Largura: {r.Width}, Altura: {r.Height}",
_ => "Forma desconhecida"
};
Console.WriteLine(result);
}
}
}
Neste exemplo, criamos uma classe base Shape
e duas classes derivadas Circle
e Rectangle
. A expressão switch permite verificar o tipo do objeto em tempo de execução e criar variáveis locais para acessar suas propriedades. O padrão _
captura qualquer tipo não previsto, garantindo segurança e evitando exceções.
Este exemplo demonstra conversão segura de tipos, extração de propriedades e lógica de decisão concisa. Em projetos reais, o Pattern Matching simplifica o tratamento de coleções heterogêneas e melhora a manutenção do código, ao mesmo tempo que garante a robustez e legibilidade.
Exemplo Prático
textusing System;
using System.Collections.Generic;
namespace PatternMatchingAdvanced
{
public abstract class Employee
{
public string Name { get; set; }
protected Employee(string name) => Name = name;
}
public class Manager : Employee
{
public int TeamSize { get; set; }
public Manager(string name, int teamSize) : base(name) => TeamSize = teamSize;
}
public class Developer : Employee
{
public string PrimaryLanguage { get; set; }
public Developer(string name, string language) : base(name) => PrimaryLanguage = language;
}
class Program
{
static void ProcessEmployee(Employee employee)
{
switch (employee)
{
case Manager m when m.TeamSize > 10:
Console.WriteLine($"Gerente sênior: {m.Name}, equipe: {m.TeamSize}");
break;
case Manager m:
Console.WriteLine($"Gerente: {m.Name}, equipe: {m.TeamSize}");
break;
case Developer d:
Console.WriteLine($"Desenvolvedor: {d.Name}, linguagem principal: {d.PrimaryLanguage}");
break;
default:
Console.WriteLine($"Tipo desconhecido de funcionário: {employee.Name}");
break;
}
}
static void Main(string[] args)
{
var employees = new List<Employee>
{
new Manager("Alice", 12),
new Developer("Bob", "C#"),
new Manager("Charlie", 5)
};
foreach (var emp in employees)
{
ProcessEmployee(emp);
}
}
}
}
No exemplo avançado, usamos Pattern Matching para diferenciar tipos de funcionários e aplicar condições adicionais com when
. O método ProcessEmployee
processa uma coleção heterogênea, acessando propriedades específicas de cada tipo com segurança.
As boas práticas incluem sempre utilizar um caso default, nomear variáveis de forma significativa e estruturar o código para manter a legibilidade. O Pattern Matching ajuda a otimizar algoritmos, reduzir complexidade e aumentar a confiabilidade do código corporativo.
Boas práticas e armadilhas comuns em C#:
- Sempre incluir um caso default para tipos desconhecidos.
- Utilizar
when
para condições adicionais e evitar if-else aninhados. - Evitar conversões desnecessárias de tipos; prefira Type Patterns.
- Adotar expressões switch para maior legibilidade.
- Verificar null quando necessário.
- Evitar criação desnecessária de objetos em cenários críticos de desempenho.
- Nomear variáveis de forma clara e significativa.
- Testar cuidadosamente a lógica de Pattern Matching.
- Seguir princípios SOLID e convenções de nomenclatura.
📊 Tabela de Referência
C# Element/Concept | Description | Usage Example |
---|---|---|
Type Pattern | Verifica o tipo e cria variável local | case Circle c: Console.WriteLine(c.Radius); |
Property Pattern | Verifica propriedades do objeto | case Rectangle r when r.Width > 10: … |
Tuple Pattern | Verifica elementos de uma tupla | case (int x, int y) when x > y: … |
Switch Expression | Forma concisa de lógica condicional | var result = shape switch { Circle c => c.Radius, _ => 0 }; |
when Condition |
Adiciona condição extra ao padrão | case Manager m when m.TeamSize > 10: … |
Dominar Pattern Matching permite escrever código seguro, limpo e eficiente. Elementos-chave incluem Type Patterns, Property Patterns, Tuple Patterns, expressões switch e when
. Próximos passos incluem estudar Recursive Patterns, Deconstruction de Records e uso de Pattern Matching em LINQ. Essas técnicas são essenciais para desenvolvimento back-end, APIs e aplicações corporativas, fortalecendo habilidades em arquitetura de software e raciocínio algorítmico.
🧠 Teste Seu Conhecimento
Test Your Knowledge
Test your understanding of this topic with practical questions.
📝 Instruções
- Leia cada pergunta cuidadosamente
- Selecione a melhor resposta para cada pergunta
- Você pode refazer o quiz quantas vezes quiser
- Seu progresso será mostrado no topo