Menú de navegaciónMenú
Categorías

La mejor forma de Aprender Programación online y en español www.campusmvp.es

?id=8d7a2595-5723-42c4-84e4-29996a09617a

Tuplas en .NET 4: Una manera mejor de guardar valores relacionados

Icono de advertencia ATENCIÓN: este contenido tiene más de 2 años de antigüedad y, debido a su temática, podría contener información desactualizada o inexacta en la actualidad.

Una Tupla es una estructura de datos que nos permite almacenar hasta 8 valores diferentes, de diferentes tipos, que están relacionados de algún modo y usando una sola variable.

Es un concepto muy sencillo que posibilita el manejo de manera conjunta de unos pocos datos relacionados sin necesidad de estar utilizando matrices (poco cohesionadas), colecciones (demasiado especializadas para esto) o creando nuestras propias clases (algo tedioso y que debería ser innecesario para cosas sencillas).

Tuplas en .NET

Así, en una declaración rápida podemos crear una Tupla y utilizarla para cualquier necesidad, por ejemplo de este modo:

Ejemplo codigo tupla1

En este caso es una 3-Tupla con tres elementos de tipo entero, cadena y fecha respectivamente. Se asemejan a un registro de una base de datos, porque en realidad se usan para crear registros en memoria con datos relacionados.

Podemos usarlas accediendo a cada elemento a través de sus propiedades Item1, Item2, y sucesivos (hasta Item7). El octavo elemento se llama "rest" porque es el "resto" de la información que queramos añadir, y puede ser también una Tupla.

Se pueden crear también directamente infiriendo los tipos, lo cual es mucho más cómodo, usando el método estático Create de la clase Tuple, de la siguiente manera:

Ejemplo codigo tupla2

que sería equivalente a lo anterior.

Debemos fijarnos en que el constructor (o Create) no devuelve una clase Tuple, ya que ésta es estática y se utiliza solamente para instanciar clases internas de esta índole.

Sus principales usos son:

  • Manejar en memoria conjuntamente un grupo pequeño de datos que están relacionados.
  • Devolver varios valores en un método sin tener que usar una clase propia, una matriz o parámetros de tipo "out"
  • Pasar fácilmente varios parámetros a algunos métodos que sólo admiten un parámetro, como por ejemplo al método Thread.Start, el cual sólo admite un objeto como argumento.
Fecha de publicación:
José Manuel Alarcón Fundador de campusMVP, es ingeniero industrial y especialista en consultoría de empresa. Ha escrito diversos libros, habiendo publicado hasta la fecha cientos de artículos sobre informática e ingeniería en publicaciones especializadas. Microsoft lo ha reconocido como MVP (Most Valuable Professional) en desarrollo web desde el año 2004 hasta la actualidad. Puedes seguirlo en Twitter en @jm_alarcon o leer sus blog técnico o personal. Ver todos los posts de José Manuel Alarcón
Archivado en: General

Boletín campusMVP.es

Solo cosas útiles. Una vez al mes.

🚀 Únete a miles de desarrolladores

DATE DE ALTA

x No me interesa | x Ya soy suscriptor

La mejor formación online para desarrolladores como tú

Comentarios (9) -

Juan Quijano
Spain Juan Quijano

Buenas,

Tal y como han comentado por Twiter, me parece que las tuplas quitan expresividad al código y tienen las carencias de las "magic string".

Si bien es cierto que el intelisense ayuda al indicarte cuantos valores hay en la tupla, aún me parece escaso el que solo se puedan invocar por enumerador o por el nombre inexpresivo que ofrece la tupla.

Prefiero hacer una pequeña clase con sus propiedades.

Pero, es de muy agradecer que publiques estos pequeños trucos que permite el lenguaje por si algún día nos lo encontramos en un código y poder reconocerlo.

Responder

Hola Juan:

Sí, son horrendas, tienes razón, pero tienen su razón de ser.

Las Tuplas nacieron con F# 1.0 (aunque hay son mucho más fáciles de expresar) y de repente gracias a este lenguaje se empezaron a hacer muy conocidas. Sin embargo ni C# ni VB.NET tenían soporte para tuplas, por lo que hacía difícil su interacción con F# en algunos casos.

Debido a ello en .NET 4.0 el equipo de .NET decidió incluirlas como ciudadanas de primera clase en el CLR, así que crearon esta clase Tuple que sirve para emular una tupla de C# y asegurar que funcionan de manera consistente en toda la plataforma .NET. Se trata de una clase de tipo "Factoría" que se encarga de crearse a si misma como muestro en el post.

Normalmente, en código tuyo, usarás una estructura o una clase. De hecho ahora es muy fácil crear clases anónimas por lo que se justifica menos usar una tupla.

Por cierto, las tuplas son tipos por referencia, como las clases, así que no se puede usar estrictamente estructuras para sustituirlas, ya que éstas son tipos por valor.

Sin embargo en ocasiones pueden venirte bien, sobre todo si todo el código que las usa es tuyo (la función que las toma y las que llaman a esa función).

En cualquier caso, y precisamente como son algo de nicho, me pareció interesante comentarlas aquí en aras de difundir su existencia entre los programadores .NET, que normalmente no las conocen.

Saludos.

Responder

Habiendo clases anónimas, las tuplas no tienen demasiado sentido en C#.

Responder

José Manuel Alarcón
Spain José Manuel Alarcón

Hola:

Bueno, depende de para qué. Efectivamente para pasar como parámetros simplemente, los tipos anónimos son más cómodos. Sin embargo no puedes devolver tipos anónimos como resultado de una función (con return), y además muchas veces tendrás que recurrir a reflexión para poder leer sus propiedades, cosa que no ocurre con una Tupla.

Cada cosa dentro de la plataforma tiene sus casos de uso y están ahí por algo, no lo olvidemos :-)

Saludos.

Responder

Clara Orti
Clara Orti

Que diferencia hay entre un diccionario key,value , y una tupla? A nivel de performance, memoria etc...

Responder

José Manuel Alarcón
José Manuel Alarcón

Hola Clara:

Dados los tamaños que manejan las tuplas, en cuanto a eso que comentas (memoria, rendimiento...) no creo que haya diferencia apreciable alguna en su uso, salvo que vayas a almacenar muchas tuplas juntas en alguna colección (que no sé si tendría mucho sentido, aunque dependerá del caso, vete a saber), ya que un diccionario requiere una clave y una tupla no, así que es menos memoria solo por eso.

Luego hay muchas diferencias entre ellas, pero impactan más bien en su uso y no en lo que mencionas.

Como digo en uno de los comentarios anteriores, son más una estructura de nicho que algo que vayas a usar constantemente, pero por eso merece la pena mencionarlas en este post: para que se conozcan un poco.

Saludos.

Responder

Luis Alberto
Luis Alberto

Yo tenia una duda ¿no se supone que es las tuplas es la novedad en C# 7.0?, saludos

Responder

José Manuel Alarcón
José Manuel Alarcón

Hola Luis:

Las tuplas se presentaron en .NET 4.0 hace ya bastantes años. Lo que ocurre es que tenían algunas limitaciones. En .NET 7 se han ampliado sus capacidades para poder declararlas "inline" y que funcionen mejor en APIs públicas.

Sí que es cierto que se han puesto como una novedad en muchos sitios, pero desconozco el motivo porque como digo llevan estando disponibles desde 2010, cuando salió .NET 4, o sea, casi 8 años.

Cuando tenga un hueco ampliaré este post para incluir detalles sobre las tuplas en C# 7.

Saludos!

Responder

Luis Alberto
Luis Alberto

Gracias por la respuesta, como soy nuevo en el lenguaje por eso mi duda, mas saludos

Responder

Agregar comentario

Los datos anteriores se utilizarán exclusivamente para permitirte hacer el comentario y, si lo seleccionas, notificarte de nuevos comentarios en este artículo, pero no se procesarán ni se utilizarán para ningún otro propósito. Lee nuestra política de privacidad.