Dela via


Allmänna procedurer i Visual Basic

En allmän procedur, även kallad allmän metod, är en procedur som definieras med minst en typparameter. Detta gör att anropskoden kan skräddarsy datatyperna efter dess krav varje gång den anropar proceduren.

Ett förfarande är inte generiskt enbart på grund av att det definieras i en generisk klass eller en generisk struktur. För att vara allmän måste proceduren ta minst en typparameter, utöver alla normala parametrar som den kan ta. En allmän klass eller struktur kan innehålla icke-generiska procedurer, och en icke-generisk klass, struktur eller modul kan innehålla generiska procedurer.

En allmän procedur kan använda sina typparametrar i sin normala parameterlista, i sin returtyp om den har en och i sin procedurkod.

Typinferens

Du kan anropa en allmän procedur utan att ange några typargument alls. Om du kallar det så här försöker kompilatorn fastställa lämpliga datatyper som ska skickas till procedurens typargument. Detta kallas typinferens. Följande kod visar ett anrop där kompilatorn härleder att den ska skicka typ String till typparametern t.

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

Om kompilatorn inte kan härleda typargumenten från anropets kontext rapporterar den ett fel. En möjlig orsak till ett sådant fel är ett matchningsfel i matrisrankningen. Anta till exempel att du definierar en normal parameter som en matris av en typparameter. Om du anropar den allmänna proceduren som tillhandahåller en matris med en annan rangordning (antal dimensioner) leder matchningsfelet till att typinferensen misslyckas. Följande kod visar ett anrop där en tvådimensionell matris skickas till en procedur som förväntar sig en endimensionell matris.

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

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

Du kan bara anropa typinferens genom att utelämna alla typargument. Om du anger ett typargument måste du ange alla.

Typinferens stöds endast för allmänna procedurer. Du kan inte anropa typinferens för allmänna klasser, strukturer, gränssnitt eller ombud.

Exempel

beskrivning

I följande exempel definieras en allmän Function procedur för att hitta ett visst element i en matris. Den definierar en typparameter och använder den för att konstruera de två parametrarna i parameterlistan.

Kod

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

Kommentarer

Föregående exempel kräver möjligheten att jämföra searchValue med varje element i searchArray. För att garantera den här möjligheten begränsar den typparametern T för att implementera IComparable<T> gränssnittet. Koden använder CompareTo metoden i stället för operatorn = eftersom det inte finns någon garanti för att ett typargument som angetts för T stöder operatorn = .

Du kan testa proceduren findElement med följande kod.

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

Föregående anrop för att MsgBox visa "0", "1" respektive "-1".

Se även