domingo, 24 de julio de 2016

Tuplas en C# | Fundamentos

Índice

1. Introducción
2. Palabras Clave
3. Tuplas
3.1 Generalidades
3.2 Declaración
3.2.1 Vía constructor
3.2.2 Método utilitario Tuple.Create
3.2.3 Inferencia tipos paramétricos
3.3 Acceso a miembros
3.4 Alternativa a tuplas
3.5 Comparación de tuplas
4. Conclusiones
5. Literatura & Enlaces

1. Introducción

En la versión 4.0 de .NET Framework se introdujeron un conjunto de clases genéricas para la contención de distintos de valores de tipos paramétricos. Este artículo C# describe los fundamentales de este elemento de programa; entre los temas principales: declaración, inferencia declarativa, alternativa a tuplas, y al final, comparación de tuplas.

2. Palabras Clave

  • .NET
  • C#
  • Comparación
  • Elemento de programa
  • object
  • Tipo paramétrico
  • Tupla

3. Tuplas

3.1 Generalidades

A partir de la versión 4.0 de Microsoft .NET Framework el programador de C# cuenta con otro tipo de elemento de programa conocido como tupla. Una tupla es un tipo de estructura para contener instancias de diferentes tipos de datos.

Las clases estándar en esta versión de .NET y subsiguientes son (Albahari, 2012):

public class Tuple<T1>
public class Tuple<T1, T2>
public class Tuple<T1, T2, T3>
public class Tuple<T1, T2, T3, T4>
public class Tuple<T1, T2, T3, T4, T5>
public class Tuple<T1, T2, T3, T4, T5, T6>
public class Tuple<T1, T2, T3, T4, T5, T6, T7> public class Tuple<T1, T2, T3, T4, T5, T6, T7, TRest>


No existe un límite práctico en el número de elementos que una tupla puede contener. Aunque no existen métodos utilitarios para esta tarea, el programador debe usar la última versión del listado anterior e incluir en el último otro objeto Tuple de las primeras 7 versiones descritas.

Ejemplo básico de uso:

var primos19A29 = new Tuple<int, int, int>(19, 23, 29);
var primos2A17 = new Tuple<int, int, int, int, int, int, int, Tuple<int, int, int>>(
2, 3, 5, 7, 11, 13, 17, primos19A29);


Este tipo de enfoque se le podría llamar extensión por contención.


Una utilidad interesante de las tuplas es el retorno de múltiples valores en un método, o en la creación de una estructura de pares de valores (Albahari, 2012).

3.2 Declaración

El programador puede usar tres distintos enfoques para declarar una tupla.

3.2.1 Vía constructor

var tuplaUniandes = new Tuple<string, string>("Uniandes", "www.uniandes.edu.co");

El lector debe notar que aquí se ha utilizado la segunda versión de tuplas estándar disponibles. Se especificó los tipos de datos para los tipos paramétricos: string.

3.2.2 Método utilitario Tuple.Create

Tuple<string, string> tuplaUniandes = Tuple.Create("Uniandes", "www.uniandes.edu.co");

En la declaración del tipo de dato para la variable tuplaDatos se especificaron los tipos parámetricos; luego con el método Tuple.Create<T1, T2> ("Tuple.Create<T1, T2>", 2016) se crea efectivamente la tupla.

Existen hasta 8 versiones sobrecargadas de Tuple.Create ("Tuple Class", 2016)
Versiones sobrecargadas de Tuple.Create
Figura 1. Versiones sobrecargadas de Tuple.Create ("Tuple Class", 2016).

3.2.3 Inferencia tipos paramétricos

var tuplaUniandes = Tuple.Create("Uniandes", "www.uniandes.edu.co");
En este caso el compilador se encarga de deducir los tipos paramétricos.

3.3 Acceso elementos

Cada miembro de la tupla se implementa como una propiedad. Para acceder a estos miembros se utiliza la invocación estándar de propiedades con Item1, Item2, etcétera. 

Ejemplo de uso:

var tuplaUniandes = Tuple.Create("Uniandes", "www.uniandes.edu.co");
Console.WriteLine(tuplaUniandes.Item1.ToUpper()
+ " - " + tuplaUniandes.Item2);

Resultado en la ventana Results de LINQPad

UNIANDES - www.uniandes.edu.co

3.4 Alternativa a tuplas

Un arreglo de objetos constituye una alternativa a las tuplas; sin embargo, ésta ya no contará con la inferencia estática de tipos paramétricos (sección 3.2.3).

Ejemplo de uso:

object[] items = { 528, "xCSW"};

Console.WriteLine(((int)items[0]) * 4);
Console.WriteLine(((string)items[1]).ToUpper());

En este escenario el programador debe especificar un cast explícito al recuperar un lemento del arreglo de objetos object.

3.5 Comparación de tuplas

El método Equals ha sido sobrescrito para las tuplas. Esto a razón de que una tupla se representa como una clase.

Ejemplo de uso

var tupla1 = Tuple.Create(528, "xCSw");
var tupla2 = Tuple.Create(528, "xCSw");

Console.WriteLine(tupla1 == tupla2); // False
Console.WriteLine(tupla1.Equals(tupla2)); // True

4. Conclusiones

Se estudiaron los fundamentos de las tuplas. Clase últil para permitir a un método retornar múltiples valores. Se estudió los diferentes mecanismos de declaración: constructor, métodos sobrecargados Tuple.Create, inferencia tipos paramétricos.

Para seguir avanzando en el estudio de C#, el siguiente artículo presenta la estructura Guid.

5. Literatura & Enlaces

Albahari, J., Albahari, B. (2012). C# 5.0 in a Nutshell. United States: O'Reilly Media.
Tuple Class (System) (2016, julio 24). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.tuple(v=vs.110).aspx
Tuple.Create(T1, T2) Method (T1, T2) (System) (2016, julio 24). Recuperado desde: https://msdn.microsoft.com/en-us/library/dd387181(v=vs.110).aspx


O

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.