Tuplas em C#
C#
Olá pessoa!
Hoje falaremos de uma funcionalidade que já existia no C#, mas que teve uma melhora absurda nas últimas atualizações!
Estamos falando das Tuplas!
As tuplas do namespace System.Tuple
existem no C# faz um bom tempo, mas talvez você nunca tenha ouvido falar delas.
Primeiro vamos entender para o que elas servem. As tuplas representam uma estrutura de dados simples, geralmente carregando poucas informações, ideal para quando você precisa retornar parte de um objeto e não deseja criar um tipo novo, só para remover algumas propriedades.
Poxa, mas a ideia parece ótima, certo?
Sim, de fato, é uma ideia fantástica, mas a sintaxe para utilização destas tuplas não eram a coisa mais amigável que você já viu no C#.
Vamos ver como fica um código simples, utilizando tuplas:
public Tuple<int, string, string> ObterUsuario(int id)
{
//Obtive os dados do banco de dados
return new Tuple<int, string, string>(10, "Gabriel", "gabriel.schade@email.com");
}
Bom, este método é bastante simples. Estou realizando uma busca em um banco de dados simulado, obtendo o identificador, nome e e-mail do usuário e encapsulando-os em uma tupla.
Ok, a sintaxe de criação é um pouco verbosa, mas nada tão terrível assim. Então qual o problema?
Bom… Vamos obter os dados novamente:
Tuple<int, string, string> tupla = ObterUsuario(13);
int id = tupla.Item1;
string nome = tupla.Item2;
string email = tupla.Item3;
Tá, agora deu para entender né?
Para obter os dados das tuplas temos que utilizar como nome de propriedade ItemX
. Isso dificulta bastante o entendimento do código.
Além disso, uma tupla suporta até oito propriedades, mas é completamente insano controlar oito propriedades utilizando propriedades que se chamam Item
, então, não faça isso, por favor.
Beleza Gabriel, então você fez um post para criticar uma feature?
Não.
Mesmo essa tupla tendo algumas coisas ruins, ela tem seu valor. E o C# não se contentou com isso, agora temos acesso à um novo tipo de tupla, são as chamadas ValueTuples
.
Esta nova tupla é totalmente maravilhosa. Sério.
Todas as reclamações foram ouvidas e uma salva de palmas para todo o time do C#. :clap::clap:
Para instalar estas tuplas em sua aplicação C# utilize o NuGet!
PM> Install-Package System.ValueTuple
Com ela instalada, vamos refazer o mesmo código, agora na nova sintaxe!
public (int, string, string) ObterUsuario(int id)
{
//Obtive os dados do banco de dados
return (10, "Gabriel", "gabriel.schade@email.com");
}
(int, string, string) tupla = ObterUsuario(10);
int id = tupla.Item1;
string nome = tupla.Item2;
string email = tupla.Item3;
Beleza, para definir o tipo das tuplas agora só precisamos colocar os tipos agrupados em um parênteses, é isso?
Sim, mas também é muito mais do que isso!
Nesta nova tupla é possível nomear os itens, ou seja, não precisaremos mais utilizar as propriedades como ItemX
!
public (int id, string nome, string email) ObterUsuario(int id)
{
//Obtive os dados do banco de dados
return (10, "Gabriel", "gabriel.schade@email.com");
}
(int id, string nome, string email) usuario = ObterUsuario(10);
int id = usuario.id;
string nome = usuario.nome;
string email = usuario.email;
Legal né?
Mas ainda tem mais!
Existe uma feature chamada desconstrução. Como o nome já sugere, podemos desconstruir uma tupla em variáveis locais, veja a sintaxe:
var (id, nome, email) = ObterUsuario(10);
int _id = id;
string _nome = nome;
string _email = email;
Note que desta forma os valores não são armazenados em uma tupla, são armazenados diretamente em variáveis.
Outro ponto interessante sobre a desconstrução das tuplas é que podemos escolher apenas algumas das propriedades para armazenar em varíaveis, ou seja, não é necessário criar variáveis para todas as propriedades.
Vamos supor que precisaríamos apenas do id e do email, podemos substituir a variável nome pelo caracter _
, dessa forma, ignoramos esta propriedade.
var (id, _, email) = ObterUsuario(10);
int _id = id;
string _email = email;
Eu pessoalmente fiquei muito feliz com esta funcionalidade, inclusive, utilizei estas novas tuplas em diversos métodos da Tango.
A sintaxe se parece muito mais com as tuplas do F# e sem dúvidas é um passo na direção certa do C#!
O que você achou deste post?
Me conte nos comentários!
E Até mais!
Sempre vale lembrar que as informações e textos aqui no blog representam minha opinião pessoal, o que pode não ser igual à sua ou de qualquer outra pessoa, incluindo a empresa para qual eu trabalho. Portanto as publicações inseridas aqui estão relacionadas somente a mim.