Freigeben über


Generische Prozeduren in Visual Basic

Eine generische Prozedur, auch als generische Methode bezeichnet, ist eine Prozedur, die mit mindestens einem Typparameter definiert ist. Dadurch kann der aufrufende Code die Datentypen bei jedem Aufruf der Prozedur an seine Anforderungen anpassen.

Eine Prozedur ist nicht einfach durch die Definition innerhalb einer generischen Klasse oder einer generischen Struktur generisch. Um generisch zu sein, muss die Prozedur mindestens einen Typparameter verwenden, zusätzlich zu allen normalen Parametern, die sie aufnehmen könnte. Eine generische Klasse oder Struktur kann nichtgenerische Prozeduren enthalten, und eine nichtgenerische Klasse, Struktur oder ein Modul kann generische Prozeduren enthalten.

Eine generische Prozedur kann ihre Typparameter in der normalen Parameterliste, in ihrem Rückgabetyp verwenden, sofern vorhanden, und im Prozedurcode.

Typableitung

Sie können eine generische Prozedur aufrufen, ohne überhaupt Typargumente bereitstellen zu müssen. Wenn Sie dies auf diese Weise aufrufen, versucht der Compiler, die geeigneten Datentypen zu ermitteln, die an die Typargumente der Prozedur übergeben werden sollen. Dieser Vorgang wird als Typrückschluss bezeichnet. Der folgende Code zeigt einen Aufruf, bei dem der Compiler folgert, dass er den Typ String an den Typparameter t übergeben sollte.

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, meldet er einen Fehler. Eine mögliche Ursache für einen solchen Fehler ist eine Arrayrangabweichung. Angenommen, Sie definieren einen normalen Parameter als Array eines Typparameters. Wenn Sie die generische Prozedur aufrufen, die ein Array einer anderen Rangfolge (Anzahl der Dimensionen) angibt, führt die Fehlende Übereinstimmung dazu, dass die Typausleitung fehlschlägt. Der folgende Code zeigt einen Aufruf, bei dem ein zweidimensionales Array an eine Prozedur übergeben wird, die ein eindimensionales Array erwartet.

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 Typinferenz nur aufrufen, indem Sie alle Typargumente auslassen. Wenn Sie ein Typargument angeben, müssen Sie alle angeben.

Typinference wird nur für generische Prozeduren unterstützt. Sie können keinen Typrückschluss für generische Klassen, Strukturen, Schnittstellen oder Delegaten aufrufen.

Beispiel

BESCHREIBUNG

Im folgenden Beispiel wird eine generische Function Prozedur definiert, um ein bestimmtes Element in einem Array zu finden. Er definiert einen Typparameter und verwendet ihn, um die beiden Parameter in der Parameterliste zu erstellen.

Programmcode

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

Um das vorangehende Beispiel auszuführen, ist die Fähigkeit erforderlich, searchValue mit jedem Element von searchArray zu vergleichen. Um diese Fähigkeit zu gewährleisten, schränkt sie den Typparameter T ein, um die IComparable<T> Schnittstelle zu implementieren. Der Code verwendet die CompareTo Methode anstelle des = Operators, da keine Garantie dafür besteht, dass ein Typargument für T den = Operator unterstützt.

Sie können die findElement Prozedur mit dem folgenden 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 vorherigen Aufrufe von MsgBox zeigen jeweils "0", "1" und "-1" an.

Siehe auch