Condividi tramite


Routine generiche in Visual Basic

Una routine generica, chiamata anche metodo generico, indica una routine definita con almeno un parametro di tipo. Essa consente al codice chiamante di personalizzare i tipi di dati per soddisfare le relative esigenze ad ogni chiamata della routine.

Una routine non è generica semplicemente perché definita all'interno di una classe generica o di una struttura generica. Affinché sia generica, la routine deve utilizzare almeno un parametro di tipo, oltre a tutti i normali parametri che può utilizzare. Una classe o struttura generica può contenere routine non generiche mentre una classe, una struttura o un modulo non generico può contenere routine generiche.

Una routine generica può utilizzare i parametri di tipo contenuti nel relativo elenco di parametri normali, nel tipo restituito se ne presenta uno e nel relativo codice della routine.

Inferenza di tipi

È possibile chiamare una routine generica senza fornire alcun argomento di tipo. Se la chiamata viene effettuata con questa modalità, il compilatore tenta di determinare i tipi di dati appropriati da passare agli argomenti di tipo della routine. Questo meccanismo è denominato inferenza di tipi. Nel codice riportato di seguito viene illustrata una chiamata in cui il compilatore deduce che il tipo String deve essere passato al parametro di tipo t.

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

Se il compilatore non è in grado di dedurre gli argomenti di tipo dal contesto della chiamata, viene segnalato un errore. Una possibile causa di tale errore è dovuta a una mancata corrispondenza del numero di dimensioni della matrice. Si supponga ad esempio di definire un normale parametro come matrice di un parametro di tipo. Se si chiama la routine generica fornendo una matrice con un numero di dimensioni differenti, la mancata corrispondenza provoca la non riuscita dell'inferenza di tipi. Nel codice riportato di seguito viene illustrata una chiamata in cui una matrice bidimensionale viene passata a una routine che prevede una matrice unidimensionale.

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

End Sub

Public Sub callDemoSub()

Dim twoDimensions(,) As Integer

demoSub(twoDimensions)

End Sub

È possibile richiamare l'inferenza di tipi solo omettendo tutti gli argomenti di tipo. Nel caso fornisca un argomento di tipo, sarà necessario fornirli tutti.

L'inferenza di tipi è supportata solo per le routine generiche. Non è possibile richiamare l'inferenza di tipi su classi, strutture, interfacce o delegati generici.

Esempio

Descrizione

Nell'esempio riportato di seguito viene definita una routine generica Function per trovare un particolare elemento in una matrice. Viene definito un parametro di tipo e viene utilizzato per costruire i due parametri nell'elenco di parametri.

Codice

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

Commenti

Nell'esempio precedente viene richiesto di confrontare searchValue in ogni elemento di searchArray. Per garantire questa operazione, al parametro di tipo T viene vincolata l'implementazione dell'interfaccia IComparable. Nel codice viene utilizzato il metodo CompareTo anziché l'operatore =, poiché non è garantito che un argomento di tipo fornito per T supporti l'operatore =.

È possibile eseguire il test della routine findElement mediante il codice riportato di seguito.

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

Nelle chiamate precedenti a MsgBox vengono visualizzati rispettivamente "0", "1" e "-1".

Vedere anche

Attività

Procedura: definire una classe in grado di fornire funzionalità identiche con tipi di dati diversi (Visual Basic)

Procedura: utilizzare una classe generica (Visual Basic)

Riferimenti

Elenco dei tipi (Visual Basic)

Elenco dei parametri (Visual Basic)

Concetti

Tipi generici in Visual Basic (Visual Basic)

Routine in Visual Basic

Parametri e argomenti delle routine (Visual Basic)