Compartilhar via


Procedimentos Genéricos em Visual Basic

Um procedimento genérico ,também chamado de método genérico , é um procedimento definido com pelo menos um parâmetro de tipo.Isso permite que o código de chamada adapte os tipos de dados aos seus requisitos sempre que ele chama o procedimento.

Um procedimento é não genérico simplesmente por diferenciar do que está sendo definido dentro de uma classe genérica ou uma estrutura genérica.Para ser genérico, o procedimento deve levar pelo menos um parâmetro de tipo, além de qualquer parâmetro normal que ele pode ter.Uma classe ou estrutura genérica pode conter procedimentos não genéricos e uma classe, estrutura, ou módulo não genéricos podem conter procedimentos genéricos.

Um procedimento genérico pode usar seus parâmetros de tipo em sua lista parâmetros normais, em seu tipo de retorno se ele tiver um, e em seu código de procedimento.

Inferência de Tipo

Você pode chamar um procedimento genérico sem fornecer quaisquer argumentos de tipo.Se você chamá-lo dessa maneira, o compilador tentará determinar os tipos de dados apropriados para passar para os argumentos de tipo do procedimento.Isso é chamado inferência de tipos .O código a seguir mostra uma chamada na qual o compilador infere que ele deve passar tipo String para o parâmetro de tipo t.

Public Sub testSub(Of t)(ByVal arg As t)
End Sub
Public Sub callTestSub()
    testSub("Use this string")
End Sub

Se o compilador não puder inferir os argumentos de tipo a partir do contexto de sua chamada, ele relata um erro.Uma possível causa desse erro é uma incompatibilidade de classificação de matriz.Por exemplo, suponha que você define um parâmetro normal como uma matriz de um parâmetro do tipo.Se você chamar o procedimento genérico fornecendo uma matriz de uma posição diferente (número de dimensões), a incompatibilidade fará com que inferência de tipos falhe.O código a seguir mostra uma chamada na qual uma matriz bidimensional é passada para um procedimento que espera um matriz unidimensional.

Public Sub demoSub(Of t)(ByVal arg() As t)

End Sub

Public Sub callDemoSub()

Dim twoDimensions(,) As Integer

demoSub(twoDimensions)

End Sub

Você pode chamar inferência de tipos somente omitindo todos os argumentos de tipo.Se você fornecer um argumento de tipo, você deve fornecer todos eles.

A inferência tipo é suportada somente para procedimentos genéricos.Você não pode chamar inferência de tipos em classes, estruturas, interfaces ou representantes genéricos.

Exemplo

Descrição

O exemplo a seguir define um procedimento Function genérico para localizar um elemento específico em uma matriz.Ele define um parâmetro do tipo e usa-o para construir os dois parâmetros na lista de parâmetros.

Código

Public Function findElement(Of T As IComparable) _
    (ByVal searchArray As T(), ByVal searchValue As T) As Integer
    If searchArray.GetLength(0) > 0 Then
        For i As Integer = 0 To searchArray.GetUpperBound(0)
            If searchArray(i).CompareTo(searchValue) = 0 Then Return i
        Next i
    End If
    Return -1
End Function

Comentários

O exemplo anterior requer a capacidade de comparação de searchValue com cada elemento de searchArray.Para garantir essa capacidade, ele restringe o parâmetro de tipo T para implementar a interface IComparable<T>.O código usa o método CompareTo em vez do operador =,porque não há nenhuma garantia de que um argumento de tipo fornecido para T oferece suporte ao operador =.

Você pode testar o procedimento findElement com o seguinte código:

Public Sub tryFindElement()
    Dim stringArray() As String = {"abc", "def", "xyz"}
    Dim stringSearch As String = "abc"
    Dim integerArray() As Integer = {7, 8, 9}
    Dim integerSearch As Integer = 8
    Dim dateArray() As Date = {#4/17/1969#, #9/20/1998#, #5/31/2004#}
    Dim dateSearch As Date = Microsoft.VisualBasic.DateAndTime.Today
    MsgBox(CStr(findElement(Of String)(stringArray, stringSearch)))
    MsgBox(CStr(findElement(Of Integer)(integerArray, integerSearch)))
    MsgBox(CStr(findElement(Of Date)(dateArray, dateSearch)))
End Sub

As chamadas anteriores para MsgBox exibem "0", "1" e "-1", respectivamente.

Consulte também

Tarefas

Como: Definir uma classe que pode fornecer funcionalidade idêntico em diferentes tipos de dados

Como: Usar uma classe genérica

Conceitos

Tipos genéricos no Visual Basic

Procedimentos no Visual Basic

Parâmetros do procedimento e argumentos

Referência

Lista de tipos

Lista de parâmetros