Tipos genéricos no Visual Basic

Um tipo genérico é um único elemento de programação que se adapta ao executar a mesma funcionalidade para uma variedade de tipos de dados.Quando você define uma classe genérica ou procedimento, você não precisa definir uma versão separada para cada tipo de dados para o qual você pode querer executar essa funcionalidade.

Uma analogia é um conjunto de chaves de fenda com cabeçotes removíveis.Você inspeciona o parafuso você precisará apertar e seleciona o cabeçote correto para aquele parafuso (encaixada, cruzada, estrelada).Depois de inserir a cabeça correta no cabo da chave de fenda, você executa a mesma função exata com o parafuso, a saber apertar o parafuso.

Conjunto de chaves de fenda como uma ferramenta genérica

Quando você define um tipo genérico, você o parametriza com um ou mais tipos de dados.Isso permite que o código em uso adapte os tipos de dados a seus requisitos.Seu código pode declarar vários elementos de programação diferentes a partir do elemento genérico, cada um deles agindo em um conjunto diferente de tipos de dados.Mas todos os elementos declarados realizam a lógica idêntica, não importa quais tipos de dados estejam sendo usados.

Por exemplo, você pode querer criar e usar uma classe da fila que opera em um determinado tipo de dados como String.Você pode declarar tal classe a partir de System.Collections.Generic.Queue<T>, como mostra o exemplo a seguir.

Public stringQ As New System.Collections.Generic.Queue(Of String)

Agora você pode usar stringQ para trabalhar exclusivamente com valores String.Porque stringQ é específico para String em vez de ser generalizado para valores Object, você não tem ligação tardia ou conversão de tipos.Isso economiza tempo de execução e reduz os erros em tempo de execução.

Para obter mais informações sobre o uso um tipo genérico, consulte Como: Usar uma classe genérica.

Exemplo de uma classe genérica

O exemplo a seguir mostra uma definição de uma classe genérica esqueleto.

Public Class classHolder(Of t)
    Public Sub processNewItem(ByVal newItem As t)
        Dim tempItem As t
        ' Insert code that processes an item of data type t.
    End Sub
End Class

No esqueleto anterior, t é um parâmetro de tipo , ou seja, um espaço reservado para um tipo de dados que você fornece ao declarar a classe.Em qualquer lugar no seu código, você pode declarar várias versões do classHolder fornecendo vários tipos de dados para t.O exemplo a seguir mostra duas declarações desse tipo.

Public integerClass As New classHolder(Of Integer)
Friend stringClass As New classHolder(Of String)

As declarações anteriores declaram classes construídas, no qual um tipo específico substitui o parâmetro de tipo.Esta substituição é propagada por todo o código dentro da classe construída.O exemplo a seguir mostra o que o procedimento processNewItem parece em integerClass .

Public Sub processNewItem(ByVal newItem As Integer)
    Dim tempItem As Integer
    ' Inserted code now processes an Integer item.
End Sub

Para um exemplo completo, consulte Como: Definir uma classe que pode fornecer funcionalidade idêntico em diferentes tipos de dados.

Elementos de programação qualificados

Você pode definir e usar classes genéricas, estruturas, interfaces, procedimentos e representantes.Observe que o .NET Framework define várias classes genéricas, estruturas e interfaces que representam elementos genéricos comumente usados.O namespace System.Collections.Generic fornece dicionários, listas, filas e pilhas.Antes de definir seu próprio elemento genérico, verifique se ele já está disponível no System.Collections.Generic.

Os procedimentos são não tipos, mas você pode definir e usar procedimentos genéricos.SeeProcedimentos Genéricos em Visual Basic.

Vantagens de tipos genéricos

Um tipo genérico serve como base para declarar vários elementos de programação diferentes, cada um deles funciona em um tipo de dados específico.As alternativas para um tipo genérico são:

  1. Um tipo único operando no tipo de dados Object.

  2. Um conjunto de versões tipo-específicas do tipo, cada versão individualmente codificada e operando em um tipo de dados específico como String,Integer, ou um tipo definido pelo usuário como customer.

Um tipo genérico tem as seguintes vantagens sobre essas alternativas:

  • Segurança de tipo. Tipos genéricos impõem verificação de tipos de tempo de compilação.Tipos com base no Object aceitam qualquer tipo de dados, e você deve escrever código para verificar se uma entrada de tipo de dados é aceitável.Com tipos genéricos, o compilador pode detectar más combinações de tipo antes do momento de execução.

  • Desempenho. Tipos genéricos não têm de encaixotar e desencaixotar dados, porque cada um deles é especializado para um tipo de dados.Operações com base no Object devem encaixotar tipos de dados de entrada para convertê-los em Object e desencaixotar dados destinados para saída.Conversões boxing e unboxing reduzem desempenho.

    Tipos baseados em Object também são ligados tardiamente, o que significa que acessar seus membros requer código extra no momento da execução.Isso também reduz o desempenho.

  • Código de consolidação. O código em um tipo genérico deve ser definido apenas uma vez.Um conjunto de versões de tipo específico de um tipo deve replicar o mesmo código em cada versão, com a única diferença de ser o tipo de dados específico para aquela versão.Com tipos genéricos, as versões específicas do tipo são todas geradas a partir do tipo genérico original.

  • Código reutilização. O código que não depende de um determinado tipo de dados pode ser reutilizado com vários tipos de dados se ele for genérico.Você geralmente pode reutilizar ele mesmo com um tipo de dados que você não originalmente prevê.

  • Suporte IDE. Quando você usa um tipo construído declarado de um tipo genérico, o ambiente de desenvolvimento integrado (IDE) pode dar-lhe mais suporte enquanto você estiver desenvolvendo o seu código.Por exemplo, IntelliSense™ pode mostrar as opções de tipo específico para um argumento a um construtor ou método.

  • Algoritmos genéricos. Abstratos algoritmos que são independentes de tipo são bons candidatos para tipos genéricos.Por exemplo, um procedimento genérico que classifica itens usando a interface IComparable pode ser usado com qualquer tipo de dados que implementa IComparable.

Restrições

Embora o código em um definição de tipo genérico deve ser tanto independente de tipo quanto possível, talvez seja necessário exigir uma determinada capacidade de qualquer tipo de dados fornecido para o tipo genérico.Por exemplo, se você quiser comparar dois itens com a finalidade de classificação ou ordenamento, seus tipo de dados devem implementar a interface IComparable.Você pode aplicar esse requisito adicionando uma restrição ao parâmetro do tipo.

Exemplo de uma restrição

O exemplo a seguir mostra uma definição de uma classe com uma restrição que requer o argumento de tipo para implementar IComparable .

Public Class itemManager(Of t As IComparable)
    ' Insert code that defines class members.
End Class

Se o código subsequente tentar construir uma classe de itemManager fornecendo um tipo que não implementa IComparable, o compilador sinaliza um erro.

Tipos de restrições

Sua restrição pode especificar os seguintes requisitos em qualquer combinação:

  • O argumento de tipo deve implementar uma ou mais interfaces

  • O argumento do tipo deve ser do tipo de, ou herdar de, no máximo uma classe

  • O argumento do tipo deve expor um construtor sem-parâmetros acessível para o código que cria objetos a partir dele

  • O argumento tipo deve ser um tipo de referência , ou deve ser um tipo de valor

Se você precisar impor mais de um requisito, você usa umalista de restriçõesseparas por vírgula entre chaves ({ }).Para exigir um construtor acessível, você inclui a palavra-chave Novo (Visual Basic) na lista.Para exigir um tipo de referência, inclua a palavra-chave Classe (Visual Basic) ; para exigir um tipo de valor, inclua a palavra-chave Estrutura (Visual Basic).

Para obter mais informações sobre restrições, consulte Lista de tipos.

Exemplo de várias restrições

O exemplo a seguir mostra uma definição de uma classe genérica com uma lista de restrição no parâmetro de tipo.No código que cria um exemplo da classe, o argumento do tipo deve implementar ambas as interfaces IComparable e IDisposable ,ser um tipo de referência e expor um construtor acessível sem-parâmetros.

Public Class thisClass(Of t As {IComparable, IDisposable, Class, New})
    ' Insert code that defines class members.
End Class

Termos importantes

Tipos genéricos apresentar e usam os seguintes termos:

  • Tipo Genérico.Uma definição de uma classe, estrutura, Interface, procedimento ou representante para o qual você fornece pelo menos um tipo de dados quando você o declara.

  • Parâmetro de Tipo.Em uma definição de tipo genérico, você fornece um espaço reservado para um tipo de dados ao declarar o tipo.

  • Argumento de Tipo.Um tipo de dados específico que substitui uma parâmetro do tipo quando você declara um tipo construído de um tipo genérico.

  • Restrição.Uma condição em um parâmetro do tipo que restringe o argumento de tipo, você pode fornecer para ele.Uma restrição pode exigir que o argumento de tipo deva implementar uma interface específica, ser ou herdar de uma determinada classe, ter um construtor sem-parâmetros acessível ou ser um tipo de referência ou um tipo de valor.Você pode combinar essas restrições, mas você pode especificar no máximo uma classe.

  • Tipo Construído.Uma classe, estrutura, Interface, procedimento ou representante declarado de um tipo genérico fornecendo argumentos de tipo para seus parâmetros de tipo.

Consulte também

Tarefas

Solucionando problemas de Tipos de Dados

Conceitos

Tipos de dados no Visual Basic

Caracteres de Tipo.

Tipos de valores e tipos de referências

Referência

Resumo de tipo de dados (Visual Basic)

Of

Como

Tipo de dados Object

Outros recursos

Implementação de tipos de dados

Conversões de Tipo no Visual Basic