Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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.