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: utilizzare una classe generica (Visual Basic)
Riferimenti
Elenco dei tipi (Visual Basic)
Elenco dei parametri (Visual Basic)