C# 8.0 – Specification – Pattern Matching – Positional Patterns
Índice general – C# 8.0 – Specification
Perteneciente a Pattern Matching, encontramos también una funcionalidad con respecto a las tuplas denominada Positional Patterns.
La idea detrás de Positional Patterns es ligeramente diferente a la vez que especial.
Requiere de un método Deconstruct que será encargado de consumir o convertir un objeto en una tupla de valores.
Para más información al respecto, te invito a visitar esta entrada: Deconstructing tuples and other types
Con esta premisa en mente, supongamos que partimos de la siguiente clase inicial:
private class Student { public string Name { get; set; } public int Grade { get; set; } public void Deconstruct(out string name, out int grade) => (name, grade) = (Name, Grade); }
Como podemos ver en el ejemplo, he declarado un método Deconstruct que se encargará de recibir los valores de nombre y calificación o nota para asignárselo a las propiedades que he declarado.
Lo que vamos a hacer aquí es evaluar la calificación o nota de un alumno.
Si es un 10, diremos «Excelent».
Si es un 0 y es «Mary» diremos «Fail» porque esperábamos más de ella.
En cualquier otro caso diremos «Other», y en otro caso «Unknown» (por ejemplo enviándole un null).
El código de la función que trataría y evaluaría el patrón, quedaría de la forma:
private static string PatternMatchingPositionalPatterns(object o) => o switch { Student(_, 10) => "Excelent", Student("Mary", 0) => "Fail", Student(var name, var grade) => "Other", _ => "Unknown" };
Y una posible llamada a nuestra función quedaría de la forma:
PatternMatchingPositionalPatterns(new Student() { Name = "John", Grade = 10 })
Como podemos apreciar, el uso de este patrón es realmente sencillo, quedando el código bastante fácil de mantener y entender.
Happy Coding!