Delen via


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.

Zie ook