Ir para o conteúdo

Tuplas

As tuplas são estruturas de dados que permitem agrupar um número fixo de elementos de tipos diferentes em um único objeto, sem a necessidade de criar uma class ou struct para isso.

No C# moderno (7.0+), a sintaxe (int, string) é uma forma amigável de usar o struct System.ValueTuple, que é um tipo de valor leve e eficiente. Existe também a versão legada, a class System.Tuple, que é um tipo de referência e menos performático.

Recomendação: Sempre prefira a sintaxe moderna (valor1, valor2) por sua performance e legibilidade.

Exemplo: ValueTuple (Struct, Recomendado)

// Declaração de uma tupla nomeada. Por baixo dos panos, é um ValueTuple.
(int Id, string FirstName, string LastName) person = (1, "Heviane", "Bastos");

// Acessando os elementos pelos nomes definidos
Console.WriteLine($"ID: {person.Id}, Name: {person.FirstName}");

// Declaração sem nomes explícitos (acesso por Item1, Item2...)
(int, string, string) otherPerson = (2, "Gemini", "AI");
Console.WriteLine($"ID: {otherPerson.Item1}, Name: {otherPerson.Item2}");

Exemplo: Tuple (Classe, Legado)

// Sintaxe mais verbosa, cria um objeto na heap (menos performático)
var personLegacy = Tuple.Create(3, "John", "Doe");
Console.WriteLine($"ID: {personLegacy.Item1}, Name: {personLegacy.Item2}");

Desconstrução (Deconstruction)

Desestruturar os valores de uma tupla em variáveis separadas:

// A tupla 'person' foi declarada no exemplo anterior
var (id, firstName, lastName) = person;
Console.WriteLine($"ID: {id}, First Name: {firstName}, Last Name: {lastName}");

Tuplas como Retorno de Métodos

  • Podemos ter um método que retorna uma tupla, ou seja, usar tuplas para retornar múltiplos valores de um método: O uso mais comum e poderoso de tuplas é para retornar múltiplos valores de um método de forma clara.
(int Id, string FirstName, string LastName) GetPerson() => (5, "Alice", "Smith");

var personData = GetPerson();
Console.WriteLine($"ID: {personData.Id}, First Name: {personData.FirstName}, Last Name: {personData.LastName}");

Vantagens das Tuplas

  • Simplicidade e Concisão: Permitem agrupar dados relacionados sem a sobrecarga de criar uma class ou struct.
  • Performance: Por serem structs (ValueTuple), são muito eficientes para cenários de curta duração, como retornos de métodos.
  • Flexibilidade: Facilitam a desconstrução e o trabalho com múltiplos valores retornados.

Considerações Importantes

  • Escopo de Uso: Tuplas são ideais para uso interno e temporário (ex: métodos privados). Para dados que viajam por várias camadas da aplicação (como modelos de domínio), uma class ou record ainda é a melhor escolha.
  • Mutabilidade: ValueTuple é um struct mutável. Seus campos podem ser alterados após a criação, a menos que sejam declarados com readonly.

Conclusão

As tuplas são uma ferramenta poderosa em C# para agrupar e manipular múltiplos valores de forma simples e eficiente. Elas são especialmente úteis para retornos de métodos e para agrupar dados relacionados sem a sobrecarga de criar classes adicionais.

Característica System.ValueTuple (Tupla Moderna) System.Tuple (Tupla Legada)
Tipo struct (Tipo de Valor) class (Tipo de Referência)
Performance Alta. Alocada na Stack. Baixa. Alocada na Heap.
Sintaxe (int, string) Tuple.Create(int, string)
Acesso Item1, Item2 ou nomes (.Id) Item1, Item2
Uso Recomendado Sempre que precisar de tuplas. Apenas em código antigo ou APIs que exigem.

No contexto moderno do C#, tupla é sinônimo de ValueTuple, que é um struct.