Megosztás a következőn keresztül:


Általános eljárások a Visual Basicben

Az általános eljárás, más néven általános módszer egy legalább egy típusparaméterrel definiált eljárás. Ez lehetővé teszi, hogy a hívó kód az eljárás minden hívásakor az adattípusokat a követelményekhez igazítsuk.

Az eljárás nem általános, csupán azért, mert egy általános osztályban vagy egy általános struktúrában van definiálva. Általánosnak kell lennie, az eljárásnak legalább egy típusparamétert kell alkalmaznia, az esetleges normál paraméterek mellett. Egy általános osztály vagy struktúra tartalmazhat nemgenerikus eljárásokat, és egy nemgenerikus osztály, struktúra vagy modul általános eljárásokat is tartalmazhat.

Egy általános eljárás használhatja a típusparamétereket a normál paraméterlistában, a visszatérési típusában, ha van ilyen, és az eljárás kódjában.

Típuskövetkeztetés

Általános eljárást úgy hívhat meg, hogy egyáltalán nem ad meg típusargumentumokat. Ha így hívja meg, a fordító megkísérli meghatározni a megfelelő adattípusokat az eljárás típusargumentumainak való továbbításhoz. Ezt típuskövetkeztetésnek nevezzük. Az alábbi kód egy olyan hívást mutat be, amelyben a fordító arra következtet, hogy a típust String a típusparaméternek tkell átadnia.

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

Ha a fordító nem tudja a hívás kontextusából kikövetkeztetni a típusargumentumokat, hibát jelez. Egy ilyen hiba egyik lehetséges oka a tömb rangjának eltérése. Tegyük fel például, hogy egy normál paramétert egy típusparaméter tömbjeként definiál. Ha egy másik rangot (dimenziók számát) tartalmazó tömböt tartalmazó általános eljárást hív meg, az eltérés a típusbeli következtetés meghiúsulását okozza. Az alábbi kód egy olyan hívást mutat be, amelyben egy kétdimenziós tömböt egy egydimenziós tömbre váró eljárásnak adnak át.

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

Public Sub callDemoSub()
    Dim twoDimensions(,) As Integer
    demoSub(twoDimensions)
End Sub

A típuskövetkeztetést csak az összes típusargumentum kihagyásával hívhatja meg. Ha egy típusargumentumot ad meg, az összeset meg kell adnia.

A típuskövetkeztetés csak általános eljárások esetén támogatott. Nem hívhat meg típuskövetkezményeket általános osztályokon, struktúrákon, felületeken vagy meghatalmazottakon.

Példa

Leírás

Az alábbi példa egy általános Function eljárást határoz meg egy tömb adott elemének megkereséséhez. Egy típusparamétert határoz meg, és a paraméterlistában a két paraméter létrehozásához használja.

Kód

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

Megjegyzések

Az előző példa megköveteli a összehasonlítása searchValuesearchArraya . Ennek a képességnek a garantálása érdekében a típusparamétert T korlátozza az IComparable<T> interfész implementálásához. A kód az operátor helyett a CompareTo= metódust használja, mivel nincs garancia arra, hogy a megadott T típusargumentum támogatja az operátort = .

Az eljárást az findElement alábbi kóddal tesztelheti.

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

Az előző hívások a MsgBox "0", az "1" és a "-1" megjelenítését kérik.

Lásd még