Algemene procedures in Visual Basic
Een algemene procedure, ook wel een algemene methode genoemd, is een procedure die is gedefinieerd met ten minste één typeparameter. Hierdoor kan de aanroepende code de gegevenstypen aanpassen aan de vereisten telkens wanneer de procedure wordt aangeroepen.
Een procedure is niet algemeen omdat deze wordt gedefinieerd in een algemene klasse of een algemene structuur. Om algemeen te zijn, moet de procedure ten minste één typeparameter gebruiken, naast eventuele normale parameters die nodig zijn. Een algemene klasse of structuur kan niet-genrische procedures bevatten en een niet-genrische klasse, structuur of module kan algemene procedures bevatten.
Een algemene procedure kan de typeparameters gebruiken in de normale parameterlijst, in het retourtype als deze een heeft en in de bijbehorende procedurecode.
Type deductie
U kunt een algemene procedure aanroepen zonder alle typeargumenten op te leveren. Als u dit op deze manier aanroept, probeert de compiler de juiste gegevenstypen te bepalen die moeten worden doorgegeven aan de typeargumenten van de procedure. Dit wordt typedeductie genoemd. De volgende code toont een aanroep waarin de compiler afgeeft dat het type String
moet worden doorgegeven aan de typeparameter t
.
Public Sub testSub(Of t)(ByVal arg As t)
End Sub
Public Sub callTestSub()
testSub("Use this string")
End Sub
Als de compiler de typeargumenten niet kan afleiden uit de context van uw aanroep, wordt er een fout gerapporteerd. Een mogelijke oorzaak van een dergelijke fout is een niet-overeenkomende matrixrang. Stel dat u een normale parameter definieert als een matrix van een typeparameter. Als u de algemene procedure aanroept die een matrix van een andere rang (aantal dimensies) levert, mislukt het type deductie. De volgende code toont een aanroep waarin een tweedimensionale matrix wordt doorgegeven aan een procedure die een eendimensionale matrix verwacht.
Public Sub demoSub(Of t)(ByVal arg() As t)
End Sub
Public Sub callDemoSub()
Dim twoDimensions(,) As Integer
demoSub(twoDimensions)
End Sub
U kunt alleen typedeductie aanroepen door alle typeargumenten weg te laten. Als u één typeargument opgeeft, moet u ze allemaal opgeven.
Typedeductie wordt alleen ondersteund voor algemene procedures. U kunt geen typedeductie aanroepen voor algemene klassen, structuren, interfaces of gemachtigden.
Opmerking
Beschrijving
In het volgende voorbeeld wordt een algemene Function
procedure gedefinieerd om een bepaald element in een matrix te vinden. Het definieert één typeparameter en gebruikt deze om de twee parameters in de parameterlijst samen te stellen.
Code
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
Opmerkingen
Het voorgaande voorbeeld vereist de mogelijkheid om te vergelijken searchValue
met elk element van searchArray
. Om deze mogelijkheid te garanderen, beperkt het de typeparameter T
om de IComparable<T> interface te implementeren. De code gebruikt de CompareTo methode in plaats van de =
operator, omdat er geen garantie is dat een typeargument dat wordt opgegeven voor ondersteuning van T
de =
operator.
U kunt de findElement
procedure testen met de volgende code.
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
De voorgaande aanroepen om respectievelijk '0', '1' en '-1' weer te MsgBox
geven.