Pattern Matching
El Pattern Matching en C# es una característica avanzada que permite a los desarrolladores evaluar el tipo y la estructura de los objetos en tiempo de ejecución y ejecutar lógica específica basada en esos patrones. Introducido en C# 7.0 y mejorado en versiones posteriores, Pattern Matching aumenta la legibilidad del código, reduce la necesidad de conversiones explícitas y promueve código más seguro y mantenible.
Se utiliza principalmente cuando se trabaja con colecciones heterogéneas, estructuras de datos complejas o modelos orientados a objetos sofisticados. Permite tomar decisiones basadas en el tipo o las propiedades de un objeto sin recurrir a múltiples bloques if-else anidados. Esta característica está estrechamente relacionada con conceptos fundamentales de C#, como la sintaxis, estructuras de datos, algoritmos y principios de programación orientada a objetos.
En este tutorial, aprenderás a simplificar la lógica de decisión usando Pattern Matching, mejorar la mantenibilidad del código y optimizar algoritmos. Se explorarán patrones comunes como switch expressions, Property Patterns y Tuple Patterns, y se abordarán problemas habituales como fugas de memoria y manejo incorrecto de excepciones. Al finalizar, serás capaz de aplicar Pattern Matching en proyectos reales de C#, creando código limpio, eficiente y seguro.
Ejemplo 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 => $"Radio del círculo: {c.Radius}",
Rectangle r => $"Ancho: {r.Width}, Alto: {r.Height}",
_ => "Forma desconocida"
};
Console.WriteLine(result);
}
}
}
En este ejemplo, se definen una clase base Shape
y dos clases derivadas Circle
y Rectangle
. Usando una expresión switch, se evalúa el tipo del objeto en tiempo de ejecución y se crean variables locales para acceder a sus propiedades. El patrón _
cubre tipos desconocidos, aumentando la seguridad y evitando excepciones inesperadas.
Este ejemplo demuestra cómo comprobar el tipo de un objeto de manera segura, extraer propiedades y tomar decisiones lógicas de forma concisa. En proyectos reales, Pattern Matching simplifica el mantenimiento del código y reduce la complejidad, aumentando la legibilidad y la seguridad.
Ejemplo Práctico
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 senior: {m.Name}, equipo: {m.TeamSize}");
break;
case Manager m:
Console.WriteLine($"Gerente: {m.Name}, equipo: {m.TeamSize}");
break;
case Developer d:
Console.WriteLine($"Desarrollador: {d.Name}, lenguaje principal: {d.PrimaryLanguage}");
break;
default:
Console.WriteLine($"Tipo de empleado desconocido: {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);
}
}
}
}
Este ejemplo avanzado utiliza Pattern Matching para diferenciar tipos de empleados y aplicar condiciones adicionales con when
. El método ProcessEmployee
procesa una colección heterogénea y accede de manera segura a propiedades específicas de cada tipo. Las mejores prácticas incluyen el uso de case default, nombres de variables significativos y estructura de código clara. Pattern Matching ayuda a optimizar algoritmos, reducir la complejidad y mejorar la confiabilidad del código.
Buenas prácticas y errores comunes en C#:
- Siempre incluir un case default para cubrir tipos desconocidos.
- Usar
when
para condiciones adicionales y evitar if-else anidados. - Eliminar conversiones de tipo innecesarias y usar Type Patterns.
- Emplear switch expressions para mejorar la legibilidad.
- Comprobar valores null según sea necesario.
- Limitar la creación de objetos innecesarios en secciones críticas de rendimiento.
- Nombrar variables de manera clara y significativa.
- Probar rigurosamente la lógica de Pattern Matching.
- Seguir principios SOLID y estándares de nomenclatura.
📊 Tabla de Referencia
C# Element/Concept | Description | Usage Example |
---|---|---|
Type Pattern | Verifica el tipo de un objeto y crea una variable local | case Circle c: Console.WriteLine(c.Radius); |
Property Pattern | Verifica propiedades de un objeto | case Rectangle r when r.Width > 10: … |
Tuple Pattern | Verifica los elementos de una tupla | case (int x, int y) when x > y: … |
Switch Expression | Forma concisa de tomar decisiones | var result = shape switch { Circle c => c.Radius, _ => 0 }; |
when Condition |
Agrega condiciones adicionales a un patrón | case Manager m when m.TeamSize > 10: … |
Dominar Pattern Matching permite escribir código seguro, limpio y eficiente. Los conceptos clave incluyen Type Patterns, Property Patterns, Tuple Patterns, switch expressions y when
. Los siguientes pasos incluyen explorar Recursive Patterns, Deconstruction en Records y aplicar Pattern Matching en LINQ. Estas habilidades son esenciales para desarrollo back-end, APIs y aplicaciones empresariales, fortaleciendo el pensamiento algorítmico y la arquitectura del software.
🧠 Pon a Prueba tu Conocimiento
Test Your Knowledge
Test your understanding of this topic with practical questions.
📝 Instrucciones
- Lee cada pregunta cuidadosamente
- Selecciona la mejor respuesta para cada pregunta
- Puedes repetir el quiz tantas veces como quieras
- Tu progreso se mostrará en la parte superior