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
iscom 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,orenotpara expressar condições complexas.
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}");
}
}
}