Da trilha de C# Este conceito ainda não saiu como card do dia. ir para o card de hoje

C# Tipos Intermediário

Pattern matching

O pattern matching (correspondência de padrões) é um recurso do C# que permite testar se um valor tem um formato específico e, ao mesmo tempo, extrair informações dele. Ele aparece em expressões is, em switch e em switch expressions, e evoluiu muito desde o C# 7.

Com type patterns você verifica o tipo de um objeto e já o captura em uma variável: if (obj is string s). Com property patterns você testa propriedades diretamente: if (pessoa is { Idade: >= 18 }). Já os relational patterns usam operadores como >, <, >=, <= para comparar valores, e os list patterns (C# 11+) permitem casar arrays e listas por posição, incluindo o padrão .. para ignorar elementos.

Esses recursos tornam o código mais declarativo e seguro, reduzindo a necessidade de conversões manuais e cadeias de if/else. Eles também se combinam: você pode usar and, or e not para compor padrões mais complexos.

Pontos-chave

  • is com type pattern verifica o tipo e declara uma variável de captura em uma única expressão.
  • Property patterns testam propriedades e campos diretamente, como { Nome: "Ana", Idade: > 18 }.
  • Relational patterns usam >, <, >=, <= para comparar valores em tempo de compilação.
  • List patterns casam arrays e listas por posição, com .. para ignorar partes da sequência.
  • Padrões podem ser combinados com and, or e not para expressar condições complexas.
PatternMatchingDemo.cs
using System;

public class Pessoa
{
    public string Nome { get; set; } = "";
    public int Idade { get; set; }
}

public class Program
{
    public static void Main()
    {
        object[] objetos = { 42, "texto", new Pessoa { Nome = "Ana", Idade = 25 }, new[] { 1, 2, 3 } };

        foreach (var obj in objetos)
        {
            // Type pattern + property pattern + relational pattern
            if (obj is Pessoa { Idade: >= 18 } p)
            {
                Console.WriteLine($"{p.Nome} é maior de idade.");
            }
            else if (obj is int n and > 0)
            {
                Console.WriteLine($"Número positivo: {n}");
            }
            else if (obj is string s)
            {
                Console.WriteLine($"Texto: {s.ToUpper()}");
            }
            else if (obj is int[] { Length: 3 } lista) // list pattern com propriedade
            {
                Console.WriteLine($"Array de 3 elementos: [{string.Join(", ", lista)}]");
            }
        }

        // List pattern puro
        int[] numeros = { 10, 20, 30 };
        if (numeros is [var primeiro, .., var ultimo])
        {
            Console.WriteLine($"Primeiro: {primeiro}, Último: {ultimo}");
        }
    }
}

Exercícios

  1. 1
    Fácil

    Verificando tipos com is

    Crie um programa que receba um object e use type patterns para verificar se é int, string ou double. Imprima uma mensagem diferente para cada tipo, mostrando o valor capturado.

    Resolver
  2. 2
    Médio

    Classificando pessoas com property e relational patterns

    Dada uma lista de objetos Pessoa com Nome e Idade, use property patterns e relational patterns para classificar cada uma como "Criança" (idade < 12), "Adolescente" (12 a 17), "Adulto" (18 a 59) ou "Idoso" (60+). Imprima o nome e a classificação.

    Resolver
  3. 3
    Desafio

    Analisando listas com list patterns

    Crie um método que receba um array de inteiros e use list patterns para identificar: se está vazio, se tem um elemento, se começa com 0 e termina com 0, se é uma sequência de três elementos crescentes, ou qualquer outro caso. Imprima uma descrição para cada array testado.

    Resolver

Continue estudando