Back-End

22 jun, 2017

Visual Basic 15 – Novos recursos da linguagem – Tuple

Publicidade

Neste artigo, vou apresentar um dos novos recursos da linguagem Visual Basic 15: a classe Tuple.

O Visual Basic 15 traz com ele implementações parciais de dois importantes recursos existentes na linguagem C#: tuplas e o retorno ref. Nenhum recurso é “completo”, mas eles oferecem abordagens que aplicações Visual Basic podem usar para consumir bibliotecas C# que fazem uso desses recursos.

Neste artigo, vou apresentar a classe Tuple, que fornece um mecanismo para criar uma classe com vários itens nele sem uma definição de tipo separada (não podemos modificar um Tuple já criado).

Apresentando a classe Tuple

O .NET Framework possui uma classe Tuple desde sua versão 4, e como Tuple é uma classe, isso faz com que seja necessário alocar memória para sua utilização.

Uma tupla é uma estrutura de dados que tem um número específico e uma sequência de elementos.

O .NET Framework suporta diretamente tuplas que tenham entre um a sete elementos. Além disso, você pode criar tuplas de oito ou mais elementos aninhando objetos de tupla na propriedade Rest de um objeto Tuple (Of T1, T2, T3, T4, T5, T6, T7, TRest).

As tuplas são comumente usadas ​​de quatro maneiras:

  1. Para representar um único conjunto de dados. Por exemplo, uma tupla pode representar um registro de banco de dados, e seus componentes podem representar campos individuais do registro;
  2. Fornecer acesso fácil e manipulação de um conjunto de dados;
  3. Para retornar vários valores de um método sem usar parâmetros out (em C#) ou ByRef (no Visual Basic);
  4. Para passar vários valores para um método através de um único parâmetro. Por exemplo, o método Thread.Start(Object) tem um único parâmetro que permite que você forneça um valor para o método que a thread executa no tempo de inicialização. Se você fornecer um objeto Tuple (Of T1, T2, T3) como o argumento do método, você pode fornecer a rotina de inicialização do thread com três itens de dados.

Abaixo temos a assinatura das Tuples:

Public Sub New ( item1 As T1, _
                          item2 As T2, _
	               item3 As T3, _
	     	    item4 As T4, _
		    item5 As T5, _
       	     	    item6 As T6, _
 	               item7 As T7, _
	     	    rest As TRest _
                      )

Cada uma delas possui propriedades somente-leitura chamadas item1, item2 etc., uma para cada tipo de parâmetro. Assim, basicamente a classe Tuple() fornece métodos estáticos para criar objetos de coleção de itens.

Criando Tuples

Embora você possa criar uma instância de uma classe Tuple chamando seu construtor de classe, o código para fazê-lo pode ser complicado.

A seguir, temos um exemplo que usa o construtor da classe para criar uma 7-tuple que contém dados demográficos da cidade de Nova York:

Module Module1
    Sub Main()
        ' Cria uma 7-tuple.
        Dim populacao As New Tuple(Of String, Integer, Integer, Integer, Integer, Integer, Integer) _
                           ("Nova York", 7891957, 7781984, 7894862, 7071639, 7322564, 8008278)
        ' Exibe o primeiro e o ultimo elemento
        Console.WriteLine("População de {0} em 2000: {1:N0} milhões", populacao.Item1, populacao.Item7)
        Console.ReadKey()
    End Sub
End Module

O resultado pode ser visto abaixo:

O tipo Tuple fornece métodos auxiliares que você pode chamar para instanciar objetos Tuple sem precisar especificar explicitamente o tipo de cada componente de tupla.

A seguir, temos o mesmo objeto Tuple criado pela utilização de método de ajuda Create:

Module Module1
    Sub Main()
        ' Cria uma 7-tuple.
        ' Dim população As New Tuple(Of String, Integer, Integer, Integer, Integer, Integer, Integer) _
        '                   ("Nova York", 7891957, 7781984, 7894862, 7071639, 7322564, 8008278)
        Dim populacao = Tuple.Create("Nova York", 7891957, 7781984, 7894862, 7071639, 7322564, 8008278)
        ' Exibe o primeiro e o ultimo elemento
        Console.WriteLine("População de {0} em 2000: {1:N0} milhões", populacao.Item1, populacao.Item7)
        Console.ReadKey()
    End Sub
End Module

Os métodos de ajuda Create suportam diretamente a criação de objetos Tuple que têm de um a oito componentes (isto é, singletons através de octuples). Embora não haja limite prático para o número de componentes que uma tupla pode ter, os métodos auxiliares não estão disponíveis para criar uma tupla com nove ou mais componentes.

Para criar essa mesma tupla usando o construtor, você deve chamar o construtor assim : Tuple(Of T1, T2, T3, T4, T5, T6, T7, TRest).Tuple(Of T1, T2, T3, T4, T5, T6, T7, TRest).

Usando uma Tuple em uma função

Podemos usar as Tuples para passar ou retornar vários valores de uma função.

A seguir, temos um exemplo que mostra como usar um tipo de referência, no caso um StringBuilder, em uma Tuple passando o valor por referência para uma função.

Imports System.Text
Module Module1
    Sub Main()
        ' Usa o objeto StringBuilder em uma tuple
        Dim builder As StringBuilder = New StringBuilder()
        builder.Append("Exemplo de StringBuilder")
        ' Cria uma nova instância da tuple com 3 items
        Dim tuple As Tuple(Of String, StringBuilder, Integer) =
                 New Tuple(Of String, StringBuilder, Integer)("Valor do item1", builder, 2017)
        ' Passa a tuple como parametro
        TrataTuple(tuple)
    End Sub
    Sub TrataTuple(ByRef tuple As Tuple(Of String, StringBuilder, Integer))
        ' Avalia a tuple e exibe os valores 
        Console.WriteLine(tuple.Item1)
        Console.WriteLine(tuple.Item2)
        Console.WriteLine(tuple.Item3)
    End Sub
End Module

Observe que estamos passando o objeto Tuple por referência: ByRef.

O resultado pode ser visto abaixo:

Pegue o projeto completo aqui: VB15_Tuplas.zip