Allmänna procedurer i Visual Basic
En allmän procedur, även kallad allmän metod, är en procedur som definieras med minst en typparameter. Detta gör att anropskoden kan skräddarsy datatyperna efter dess krav varje gång den anropar proceduren.
Ett förfarande är inte generiskt enbart på grund av att det definieras i en generisk klass eller en generisk struktur. För att vara allmän måste proceduren ta minst en typparameter, utöver alla normala parametrar som den kan ta. En allmän klass eller struktur kan innehålla icke-generiska procedurer, och en icke-generisk klass, struktur eller modul kan innehålla generiska procedurer.
En allmän procedur kan använda sina typparametrar i sin normala parameterlista, i sin returtyp om den har en och i sin procedurkod.
Typinferens
Du kan anropa en allmän procedur utan att ange några typargument alls. Om du kallar det så här försöker kompilatorn fastställa lämpliga datatyper som ska skickas till procedurens typargument. Detta kallas typinferens. Följande kod visar ett anrop där kompilatorn härleder att den ska skicka typ String
till typparametern t
.
Public Sub testSub(Of t)(ByVal arg As t)
End Sub
Public Sub callTestSub()
testSub("Use this string")
End Sub
Om kompilatorn inte kan härleda typargumenten från anropets kontext rapporterar den ett fel. En möjlig orsak till ett sådant fel är ett matchningsfel i matrisrankningen. Anta till exempel att du definierar en normal parameter som en matris av en typparameter. Om du anropar den allmänna proceduren som tillhandahåller en matris med en annan rangordning (antal dimensioner) leder matchningsfelet till att typinferensen misslyckas. Följande kod visar ett anrop där en tvådimensionell matris skickas till en procedur som förväntar sig en endimensionell matris.
Public Sub demoSub(Of t)(ByVal arg() As t)
End Sub
Public Sub callDemoSub()
Dim twoDimensions(,) As Integer
demoSub(twoDimensions)
End Sub
Du kan bara anropa typinferens genom att utelämna alla typargument. Om du anger ett typargument måste du ange alla.
Typinferens stöds endast för allmänna procedurer. Du kan inte anropa typinferens för allmänna klasser, strukturer, gränssnitt eller ombud.
Exempel
beskrivning
I följande exempel definieras en allmän Function
procedur för att hitta ett visst element i en matris. Den definierar en typparameter och använder den för att konstruera de två parametrarna i parameterlistan.
Kod
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
Kommentarer
Föregående exempel kräver möjligheten att jämföra searchValue
med varje element i searchArray
. För att garantera den här möjligheten begränsar den typparametern T
för att implementera IComparable<T> gränssnittet. Koden använder CompareTo metoden i stället för operatorn =
eftersom det inte finns någon garanti för att ett typargument som angetts för T
stöder operatorn =
.
Du kan testa proceduren findElement
med följande kod.
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
Föregående anrop för att MsgBox
visa "0", "1" respektive "-1".