Generische Prozeduren in Visual Basic

Eine generische Prozedur oder auch generische Methode ist eine Prozedur, die mit mindestens einem Typparameter definiert ist. Dadurch können bei jedem Aufruf der Prozedur die Datentypen im aufrufenden Code an die aktuellen Anforderungen angepasst werden.

Eine Prozedur erhält ihren generischen Charakter nicht einfach aufgrund der Definition innerhalb einer generischen Klasse oder einer generischen Struktur. Vielmehr muss die Prozedur neben den eventuell vorhandenen normalen Parametern mindestens einen Typparameter entgegennehmen, um generisch zu sein. Eine generische Klasse oder Struktur kann Prozeduren beinhalten, die nicht generisch sind, und eine nicht generische Klasse oder Struktur oder ein nicht generisches Modul kann generische Prozeduren enthalten.

Typparameter können in einer generischen Prozedur in der normalen Parameterliste, im eventuell vorhandenen Rückgabetyp sowie innerhalb des Prozedurcodes verwendet werden.

Typableitung

Sie können eine generische Prozedur ohne Angabe eines Typarguments aufrufen. Bei dieser Art des Aufrufs versucht der Compiler, die richtigen Datentypen zu bestimmen, die für die Übergabe an die Typparameter der Prozedur benötigt werden. Dies wird als Typableitung bezeichnet. Das folgende Codebeispiel zeigt einen Aufruf, bei dem der Compiler ableitet, dass dem Typparameter t der Typ String übergeben werden muss.

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

Wenn der Compiler die Typargumente nicht aus dem Kontext des Aufrufs ableiten kann, wird ein Fehler erzeugt. Eine mögliche Ursache für einen solchen Fehler ist beispielsweise die Nichtübereinstimmung eines Arrayrangs. Angenommen, Sie haben einen normalen Parameter als Array eines Typparameters definiert. Wenn Sie die generische Prozedur mit einem Array aufrufen, das über einen abweichenden Rang verfügt (Anzahl der Dimensionen), bewirkt die Nichtübereinstimmung, dass die Typableitung fehlschlägt. Das folgende Codebeispiel zeigt einen Aufruf, bei dem einer Prozedur, die ein eindimensionales Array erwartet, ein zweidimensionales Array übergeben wird.

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

End Sub

Public Sub callDemoSub()

Dim twoDimensions(,) As Integer

demoSub(twoDimensions)

End Sub

Sie können die Typableitung nur aufrufen, indem Sie sämtliche Typargumente weglassen. Wenn Sie ein Typargument angeben, müssen alle anderen Typargumente ebenfalls angegeben werden.

Die Typableitung wird nur für generische Prozeduren unterstützt. Die Typableitung kann nicht für generische Klassen, Strukturen, Schnittstellen oder Delegaten aufgerufen werden.

Beispiel

Beschreibung

Im folgenden Beispiel wird eine generische Function-Prozedur definiert, um ein bestimmtes Element in einem Array zu suchen. Sie definiert einen Typparameter und verwendet diesen zur Konstruktion der beiden Parameter in der Parameterliste.

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

Kommentare

Für das vorangehende Beispiel ist die Möglichkeit erforderlich, searchValue mit jedem Element von searchArray zu vergleichen. Um dies zu garantieren, wird der Typparameter T dahingehend eingeschränkt, dass die IComparable<T>-Schnittstelle implementiert werden muss. Im Code wird anstelle des Operators = die CompareTo-Methode verwendet, da nicht garantiert werden kann, dass das für T angegebene Typargument den Operator = unterstützt.

Sie können die findElement-Prozedur mit folgendem Code testen.

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

Die vorangehenden Aufrufe von MsgBox bewirken nacheinander die Anzeige von "0", "1" und "-1".

Siehe auch

Aufgaben

Gewusst wie: Definieren einer Klasse, die für unterschiedliche Datentypen die gleiche Funktionalität bereitstellen kann (Visual Basic)

Gewusst wie: Verwenden einer generischen Klasse (Visual Basic)

Referenz

Typenliste (Visual Basic)

Parameterliste (Visual Basic)

Konzepte

Generische Typen in Visual Basic (Visual Basic)

Prozeduren in Visual Basic

Parameter und Argumente von Prozeduren (Visual Basic)