Tuplas en C#

Hoy he estado repasando algunas de las características que fueron introducidas en la última versión de C#, así que voy a hacer un pequeño resumen sobre tuplas, básicamente lo que son y cómo debemos usarlas según las última revisión del lenguaje.

¿Que es una tupla?

Una tupla es una estructura de datos que contiene valores que pueden cambiar, los cuales si queremos podemos etiquetarlos  y además están ordenados y accesibles a través de .Item1 .Item2, etc., pero lo mejor de todo es que, como vamos a ver, podemos montar una tupla sin declarar prácticamente nada, simplemente indicando los datos que necesitamos meter en la tupla.

tuplas

¿Porqué se usan?

Seguro que alguna vez habéis tenido que usar alguno de estos tipos: ValueTuple, Pair o StructTuple. Estos tres tipos (y alguno más) se crearon para intentar solucionar varias situaciones de los desarrolladores, por ejemplo, poder tratar varios datos como si fueran parte de un solo objecto, muy útil cuando tenemos que devolver varios datos al salir de un método o si estamos haciendo una llamada asíncrona. También trabajando con pares de valores como por ejemplo una posición (x,y) sin tener que crear un objeto para este fin.

En general resulta menos costoso usar este tipo de estructuras que son más baratas en términos de tiempo y memoria que crear clases, teniendo en cuenta que este tipo de estructuras están pensadas para manejar pocas cantidades de datos.

¿Como se declaran las tuplas?

Pues de una manera muy simple:

var tupla = ("4", 3, "a");

es lo mismo que hacer:

(string, int, string) tupla = ("4", 3, "a");

Por defecto el compilador asigna una etiqueta a cada valor que metemos en la tupla, de tal forma que para acceder a los valores simplemente tenemos que hacer así:

Console.WriteLine($"{values.Item1}");
Console.WriteLine($"{values.Item2}");
Console.WriteLine($"{values.Item3}");

Si lo necesitamos podemos ser nosotros los que asignemos un nombre para cada valor de la siguiente forma:

(string Valor1, int Valor2, string Valor3) valores = ("a", 4, "3");
var valores = (Valor1: "a", Valor2: 4, Valor3: "3")

Ahora podemos acceder a los datos del mismo modo que antes mediante tupla.Item1 o refiriéndonos a la etiqueta que hemos indicado:

Console.WriteLine($"{valores .Valor1}");
Console.WriteLine($"{valores .Valor2}");
Console.WriteLine($"{valores .Valor3}");

Como usar las tuplas

Si tuviéramos que tratar diferentes valores al mismo tiempo en un método y luego devolverlos teníamos hasta ahora dos opciones, o bien crearnos una estructura de datos para realizar este cambio o pasar los valores por referencia de la siguiente manera:

class Program
{
     static void Main(string[] args)
     {
          string cadena1 = "hola";
          string cadena2 = "mundo";

          ChangeMessage(out cadena1, out cadena2);
     }

     private static void ChangeMessage(out string cadena1, out string cadena2)
     {
          cadena1 = "buenas";
          cadena2 = "noches";
     }
}

Sin embargo ahora podemos hacerlo de forma mas sencilla:

class Program
{

     static void Main(string[] args)
     {
          string cadena1 = "hola";
          string cadena2= "mundo";
         
          var cadenas= ChangeMessage(cadena1 , cadena2);
     }

     private static (string c1, string c2) ChangeMessage(string cad1, string cad2)
     {
          return (cad2, cad1);
     }
}

Para terminar ¿cómo podemos asignar valores a variables que tenemos declaradas individualmente? pues de la siguiente forma:

string comunidad;
string provincia;
int habitantes;

(comunidad,provincia,habitantes) = ("Castilla - La Mancha", "Toledo", 83741);

Console.WriteLine(comunidad + " " + provincia + " " + habitantes);

Y hasta aquí hemos llegado con las tuplas, creo que en este pequeño resumen queda plasmado que con la nueva revisión es mucho más sencillo usarlas en nuestro día a día. Para más info dejo aquí el enlace a la explicación de las tuplas en la msdn

 

César Reneses

Geek and Mobile Developer in continuous learning

 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *