Carregando...

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

text
TEXT Code
using 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

text
TEXT Code
using 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

Pronto para Começar

Test Your Knowledge

Test your understanding of this topic with practical questions.

3
Perguntas
🎯
70%
Para Passar
♾️
Tempo
🔄
Tentativas

📝 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