C# 7.0 – Specification – Tuples (Tuples Enhancement)
Continuando con la especificación de C# 7.0, otra de las nuevas características añadidas al lenguaje son las mejoras aplicadas a las tuplas o Tuples.
Dentro de .NET, podemos encontrar la clase System.Tuple.
Si estás más interesado en System.Tuple, puedes acceder a información detallada en este enlace.
Recordemos que Tuple nos permite representar una propiedad de tipo clave valor.
Lo interesante de Tuple es su versatilidad y la posibilidad de utilizarlo en cualquier momento, como si fuera un objeto pero con la particularidad de no tener que crear un objeto concreto.
Recordando el uso de System.Tuple, un ejemplo muy sencillo de su uso sería por ejemplo:
private static List<object> GetCollection() { var collection = new List<object>(); collection.Add(new { Id = 1, Name = "John", Age = 32 }); collection.Add(new { Id = 2, Name = "Mary", Age = 29 }); collection.Add(new { Id = 3, Name = "Robert", Age = 24 }); collection.Add(new { Id = 4, Name = "Loorena", Age = 34 }); return collection; } private static void Tuples() { random = random == null ? new Random() : random; var id = random.Next(1, 5); var element = GetTuplePersonBy(id); Console.WriteLine("Tuples => standard (reference type)"); Console.WriteLine($"\tid: {id}"); Console.WriteLine($"\tName: {element.Item1} - Age: {element.Item2}"); } private static Tuple<string, int> GetTuplePersonBy(int id) { var element = (GetCollection()).Cast<dynamic>().Where(p => p.Id == id).SingleOrDefault(); return new Tuple<string, int>(element.Name, element.Age); }
Recordemos que Tuple es un tipo por referencia, no como otros tipos de primitivas, la mayoría de los cuales suelen ser tipos por valor.
El hecho de que sean tipos por referencia, hacen que se guarden en el heap, lo que conlleva a que la creación y asignación en memoria reduden en un uso de CPU que podría tener implicaciones de rendimiento.
C# 7.0 por su parte, incorpora como mejora la estructura ValueTuple.
ValueTuple representa un tipo por valor de un objeto tupla.
Nota: otra de las mejoras incorporadas a ValueTuple tiene que ver con lo que se conoce como Deconstruction, algo que veremos en otra entrada.
Si no utilizamos .NET Framework 4.7 ó superior, podemos utilizar ValueTuple instalando de NuGet el paquete System.ValueTuple.
También podemos utilizar System.ValueTuple directamente si utilizamos .NET Standard Library 2.0 ó superior.
La forma de utilizar System.ValueTuple con un ejemplo equivalente al mostrado anteriormente, sería de la forma siguiente:
private static void TuplesEnhancements() { random = random == null ? new Random() : random; var id = random.Next(1, 5); var element = GetTuplesEnhancementsPersonBy(id); Console.WriteLine("Tuples => Enhancements (value type)"); Console.WriteLine($"\tid: {id}"); Console.WriteLine($"\tName: {element.Item1} - Age: {element.Item2}"); } private static (string, int) GetTuplesEnhancementsPersonBy(int id) { var element = (GetCollection()).Cast<dynamic>().Where(p => p.Id == id).SingleOrDefault(); return (element.Name, element.Age); }
Como podemos observar en este caso, no estamos indicando la clase Tuple en ningún momento, utilizándose así la estructura ValueTuple.
¡Happy Coding!