Melhore seu código com Pattern Matching aprimorado no C# 13

Imagine que você está construindo uma aplicação que processa diferentes formatos de entrada de dados, sejam eles números, cadeias de caracteres ou mesmo tipos personalizados. Pattern matchingDesenvolvimento multiplataforma com .NET MAUI e C# 13Desenvolvimento multiplataforma com .NET MAUI e C# 13Explore as novidades do C# 13 e crie apps multiplataforma com .NET MAUI neste tutorial prático, otimizado para desempenho e legibilidade. é a funcionalidade que torna o código mais expressivo e seguro, ao permitir que você avalie e manipule valores de forma simples e legível.

No C# 13O que é C# 13 e por que aprender em 90 minutosO que é C# 13 e por que aprender em 90 minutosExplore as inovações do C# 13 e melhore a legibilidade do seu código. Este tutorial prático de 90 minutos oferece dicas essenciais para desenvolvedores .NET., o pattern matchingDesenvolvimento multiplataforma com .NET MAUI e C# 13Desenvolvimento multiplataforma com .NET MAUI e C# 13Explore as novidades do C# 13 e crie apps multiplataforma com .NET MAUI neste tutorial prático, otimizado para desempenho e legibilidade. foi aprimorado com novos recursos, tornando ainda mais fácil lidar com cenários complexos sem precisar recorrer a blocos extensos de condicionais. Esse tutorial tem como objetivo apresentar esses novos recursos e demonstrar como eles podem elevar a legibilidade e o desempenho do seu código em apenas alguns exemplos práticos.

Por que o pattern matching é tão importante?🔗

O pattern matchingDesenvolvimento multiplataforma com .NET MAUI e C# 13Desenvolvimento multiplataforma com .NET MAUI e C# 13Explore as novidades do C# 13 e crie apps multiplataforma com .NET MAUI neste tutorial prático, otimizado para desempenho e legibilidade. foi introduzido originalmente para ajudar a tratar de maneira concisa tipos e valores dentro de switch expressions e condicionais. A cada versão do C#, a linguagem ganha melhorias nessa área. No C# 13O que é C# 13 e por que aprender em 90 minutosO que é C# 13 e por que aprender em 90 minutosExplore as inovações do C# 13 e melhore a legibilidade do seu código. Este tutorial prático de 90 minutos oferece dicas essenciais para desenvolvedores .NET., essas melhorias foram focadas na:

  • Simplificação de código: reduzir a verbosidade ao lidar com diversos cenários.
  • Clareza: extrair informações de objetos sem precisar de casts manuais e checagens adicionais.
  • Desempenho: utilizar construções mais eficientes para comparar e filtrar valores, diminuindo a necessidade de instruções redundantes.

Novas construções de pattern matching no C# 13🔗

A seguir, veremos algumas das novidades relevantes na sintaxe e nas possibilidades de utilizar pattern matchingDesenvolvimento multiplataforma com .NET MAUI e C# 13Desenvolvimento multiplataforma com .NET MAUI e C# 13Explore as novidades do C# 13 e crie apps multiplataforma com .NET MAUI neste tutorial prático, otimizado para desempenho e legibilidade. no C# 13O que é C# 13 e por que aprender em 90 minutosO que é C# 13 e por que aprender em 90 minutosExplore as inovações do C# 13 e melhore a legibilidade do seu código. Este tutorial prático de 90 minutos oferece dicas essenciais para desenvolvedores .NET..

Combinações mais expressivas com “and”, “or” e “not”

O C# 13O que é C# 13 e por que aprender em 90 minutosO que é C# 13 e por que aprender em 90 minutosExplore as inovações do C# 13 e melhore a legibilidade do seu código. Este tutorial prático de 90 minutos oferece dicas essenciais para desenvolvedores .NET. se apoia no poder de expressões lógicas para criar condições compostas dentro do pattern matchingDesenvolvimento multiplataforma com .NET MAUI e C# 13Desenvolvimento multiplataforma com .NET MAUI e C# 13Explore as novidades do C# 13 e crie apps multiplataforma com .NET MAUI neste tutorial prático, otimizado para desempenho e legibilidade.. Repare como a sintaxe permite construir “blocos lógicos” dentro de um mesmo case:

public static string AvaliarValor(int numero)
{
    return numero switch
    {
0 and < 10 => "Número entre 1 e 9",
< 0 or > 100 => "Valor fora do intervalo esperado", 10 => "Exatamente 10", not 10 => "Qualquer outro número diferente de 10" }; }

Observe que:

  • and permite a junção de dois padrões obrigatórios: “número maior que zero e menor que 10”.
  • or possibilita admitir situações diferentes com apenas uma linha: “número menor que zero ou maior que 100”.
  • not inverte a condição para capturar o “caso contrário”, evitando declarações extras de if-else.

Patterns para propriedades e sub-objetos

Nos recursos anteriores de pattern matchingDesenvolvimento multiplataforma com .NET MAUI e C# 13Desenvolvimento multiplataforma com .NET MAUI e C# 13Explore as novidades do C# 13 e crie apps multiplataforma com .NET MAUI neste tutorial prático, otimizado para desempenho e legibilidade., se queríamos inspecionar as propriedades de um objeto aninhado, muitas vezes precisávamos de checagens extras. Agora, ficou mais fácil combinar a verificação de diferentes propriedades dentro de uma única expressão de pattern:

public class Produto
{
    public string Nome { get; set; }
    public decimal Preco { get; set; }
    public Categoria Categoria { get; set; }
}
public class Categoria
{
    public string NomeCategoria { get; set; }
    public bool Ativa { get; set; }
}
public static string VerificarProduto(Produto produto)
{
    return produto switch
    {
        { Nome: "Lápis", Preco: <= 1.0M, Categoria: { NomeCategoria: "Papelaria", Ativa: true } }
            => "Produto de papelaria básico",
        { Categoria: { NomeCategoria: "Eletrônicos", Ativa: true } }
            => "Produto da categoria de eletrônicos ativa",
        { Categoria.Ativa: false }
            => "Produto em categoria desativada",
        _ => "Produto sem correspondência de padrão"
    };
}

Dessa forma, podemos verificar a categoria de um produto, seu preço, a propriedade do sub-objeto e ainda fazer comparações com valores pré-definidos, tudo isso dentro de um único switch.

Operadores de range combinados com padrões

Outra evolução do C# é a capacidade de trabalhar com ranges, que agora podem ser combinados de forma ainda mais rica com padrões de intervalo. Por exemplo:

public static string ClassificarIdade(int idade)
{
    return idade switch
    {
        < 0 => "Idade inválida",
        0 or 1 => "Bebê",
= 2 and <= 12 => "Criança",
= 13 and <= 17 => "Adolescente",
< 65 => "Adulto", _ => "Idoso" }; }

Embora o uso de ranges não seja exatamente uma novidade, a integração suave com and e or em C# 13O que é C# 13 e por que aprender em 90 minutosO que é C# 13 e por que aprender em 90 minutosExplore as inovações do C# 13 e melhore a legibilidade do seu código. Este tutorial prático de 90 minutos oferece dicas essenciais para desenvolvedores .NET. permite expressar, em uma única expressão, toda a lógica de comparação sem precisar de declarações múltiplas de if-else.

Pattern matching em tuples e listas

O pattern matchingDesenvolvimento multiplataforma com .NET MAUI e C# 13Desenvolvimento multiplataforma com .NET MAUI e C# 13Explore as novidades do C# 13 e crie apps multiplataforma com .NET MAUI neste tutorial prático, otimizado para desempenho e legibilidade. também funciona muito bem para destructuring de tuples e até checagens iniciais em listas, tornando o código mais limpo. Veja um exemplo simples com tuples:

public static string AnalisarCoordenadas((int x, int y) coordenada)
{
    return coordenada switch
    {
        (0, 0) => "Origem",
        ( > 0, > 0 ) => "Primeiro quadrante",
        ( < 0, > 0 ) => "Segundo quadrante",
        ( < 0, < 0 ) => "Terceiro quadrante",
        ( > 0, < 0 ) => "Quarto quadrante",
        _ => "Posição não identificada"
    };
}

Se você utiliza listas ou arrays, poderá empregar padrões como [..] (para corresponder a listas inteiras sem se preocupar com o tamanho exato) e validar os elementos internos. Na versão 13, esses padrões ganharam melhorias, permitindo identificar sublistas específicas de forma mais expressiva.

Comparativo de código: antes e depois🔗

Para ilustrar o quanto o pattern matchingDesenvolvimento multiplataforma com .NET MAUI e C# 13Desenvolvimento multiplataforma com .NET MAUI e C# 13Explore as novidades do C# 13 e crie apps multiplataforma com .NET MAUI neste tutorial prático, otimizado para desempenho e legibilidade. do C# 13 evoluiu, segue uma breve tabela comparando a abordagem de versões anteriores com a atual:

OperaçãoEm versões mais antigasCom C# 13
Combinar múltiplas condiçõesVários if-else aninhados ou diversos cases duplicadosUso de and, or e not em uma única expressão
Inspecionar sub-objetos e propriedadesNecessidade de checar produto != null e produto.Categoria != null, etc., antes da verificação específicaPatterns aninhados: produto switch { {Nome: "X", Categoria: { NomeCategoria: "Y" } } => … }
Verificar faixas de valores em switch expressionsCombinação de expressões numero >= 0 && numero <= 9 em ifsUso integrado de >, <, <=, >= direto no switch (ex: > 0 and < 10 => "Número entre 1 e 9")
Destruturar tuples (coordenadas, por exemplo)Precisar de variáveis temporárias ou checar item a itemPatterns de tuple: ( > 0, > 0 ) => "Primeiro quadrante"
Manejo de listas/arrays (ex: sublista inicial e/ou final)Necessidade de loops e manipulação repetitivaPatterns para listas com [..], correspondência de sublistas (muito mais enxuto para inspeções rápidas)

Boas práticas e performance🔗

Exemplo prático: filtrando diferentes relatórios🔗

Suponha que tenhamos uma classe Relatorio com várias subclasses, cada uma representando um tipo de relatório. Queremos, com base no tipo e em algumas propriedades, decidir como cada relatório deve ser processado:

public abstract class Relatorio
{
    public string Autor { get; set; }
}
public class RelatorioVendas : Relatorio
{
    public decimal TotalVendido { get; set; }
}
public class RelatorioEstoque : Relatorio
{
    public int ProdutosEmEstoque { get; set; }
}
public class RelatorioFinanceiro : Relatorio
{
    public decimal SaldoAtual { get; set; }
    public bool AuditoriaExterna { get; set; }
}
public static string ProcessarRelatorio(Relatorio relatorio)
{
    return relatorio switch
    {
        RelatorioVendas { TotalVendido: > 10000M } => "Relatório de vendas de alto valor",
        RelatorioEstoque { ProdutosEmEstoque: <= 100 } => "Estoque com reposição sugerida",
        RelatorioFinanceiro { SaldoAtual: >= 0, AuditoriaExterna: true }
            => "Financeiro auditado com saldo positivo",
        _ => "Tipo de relatório genérico ou não caracterizado pelos padrões"
    };
}

Nesta amostra, utilizamos pattern matchingDesenvolvimento multiplataforma com .NET MAUI e C# 13Desenvolvimento multiplataforma com .NET MAUI e C# 13Explore as novidades do C# 13 e crie apps multiplataforma com .NET MAUI neste tutorial prático, otimizado para desempenho e legibilidade. para verificar tanto o tipo (Vendas, Estoque, Financeiro) quanto as propriedades (TotalVendido, SaldoAtual, etc.). Isso torna o código autoexplicativo, dispensando grandes blocos if (relatorio is RelatorioVendas) { … }.

Conclusão🔗

Os novos recursos de pattern matchingDesenvolvimento multiplataforma com .NET MAUI e C# 13Desenvolvimento multiplataforma com .NET MAUI e C# 13Explore as novidades do C# 13 e crie apps multiplataforma com .NET MAUI neste tutorial prático, otimizado para desempenho e legibilidade. no C# 13O que é C# 13 e por que aprender em 90 minutosO que é C# 13 e por que aprender em 90 minutosExplore as inovações do C# 13 e melhore a legibilidade do seu código. Este tutorial prático de 90 minutos oferece dicas essenciais para desenvolvedores .NET. representam um salto na clareza e na elegância do código, reduzindo a necessidade de estruturasOtimizações para desempenho: dicas de uso correto de tipos em C# 13Otimizações para desempenho: dicas de uso correto de tipos em C# 13Descubra como otimizar seu código em C# 13 com técnicas práticas. Aprenda a escolher entre struct, class, Span<T> e ValueTask para melhor desempenho. condicionais extensas e repetitivas. É um investimento pequeno de tempo que traz enorme retorno em termos de legibilidade e manutenibilidade.

Ao adotar essas novas construções, você usufrui de:

  • Código enxuto: expressões concentradas em uma única linha.
  • Confiabilidade: menor chance de esquecer checagens de null ou condições especiais.
  • Produtividade: manutenção mais simples, pois a intenção do código fica explícita.

Experimente substituir blocos if, combos switch tradicionais ou checagens aninhadas pelo poder que o pattern matchingDesenvolvimento multiplataforma com .NET MAUI e C# 13Desenvolvimento multiplataforma com .NET MAUI e C# 13Explore as novidades do C# 13 e crie apps multiplataforma com .NET MAUI neste tutorial prático, otimizado para desempenho e legibilidade. oferece em C# 13. Assim, você se habitua a uma sintaxe mais fluida e torna o seu código mais organizado, atendendo a cenários cada vez mais complexos com menos esforço de escrita e leitura.

Essa é apenas mais uma das muitas melhorias que o C# 13O que é C# 13 e por que aprender em 90 minutosO que é C# 13 e por que aprender em 90 minutosExplore as inovações do C# 13 e melhore a legibilidade do seu código. Este tutorial prático de 90 minutos oferece dicas essenciais para desenvolvedores .NET. apresentou para deixar o desenvolvimento .NET ainda mais elegante e performático. Agora é a sua vez de explorar, praticar e criar soluções poderosas usando os novos recursos de pattern matchingDesenvolvimento multiplataforma com .NET MAUI e C# 13Desenvolvimento multiplataforma com .NET MAUI e C# 13Explore as novidades do C# 13 e crie apps multiplataforma com .NET MAUI neste tutorial prático, otimizado para desempenho e legibilidade.!

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

  • Documentação Oficial Microsoft sobre C# – Fornece informações oficiais e detalhadas sobre os recursos da linguagem, incluindo as novidades no pattern matching que são o foco deste tutorial: docs.microsoft.com/pt-br/dotnet/csharp/

Compartilhar artigo

Artigos Relacionados