Generic Procedures in Visual Basic

泛型程式也稱為泛型方法,是使用至少一個類型參數定義的程式。 這可讓呼叫程式碼在每次呼叫程式時,針對其需求量身打造資料類型。

程式不是泛型,只是因為在泛型類別或泛型結構內定義。 若要是泛型,除了可能需要的任何一般參數之外,程式至少必須採用一個類型參數。 泛型類別或結構可以包含非泛型程式,而非泛型類別、結構或模組可以包含泛型程式。

泛型程式可以在其一般參數清單中、如果傳回型別有參數,則在其程式碼中使用其型別參數。

類型推斷

您可以呼叫泛型程式,而不需提供任何類型引數。 如果您以這種方式呼叫,編譯器會嘗試判斷要傳遞至程式類型引數的適當資料類型。 這稱為 類型推斷。 下列程式碼顯示編譯器推斷其應該將型別傳遞至型 String 別參數 t 的呼叫。

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

如果編譯器無法從呼叫的內容推斷類型引數,則會報告錯誤。 這類錯誤的其中一個可能原因是陣列排名不符。 例如,假設您將一般參數定義為類型參數的陣列。 如果您呼叫提供不同排名陣列的泛型程式, (維度數目) ,則不相符會導致類型推斷失敗。 下列程式碼顯示呼叫,其中二維陣列會傳遞至預期一維陣列的程式。

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

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

您只能藉由省略所有類型引數來叫用類型推斷。 如果您提供一個類型引數,則必須全部提供它們。

只有泛型程式才支援型別推斷。 您無法在泛型類別、結構、介面或委派上叫用型別推斷。

範例

描述

下列範例會定義泛型 Function 程式,以尋找陣列中的特定專案。 它會定義一個類型參數,並用它來建構參數清單中的兩個參數。

程式碼

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

註解

上述範例需要能夠與 的每個專案 searchArray 進行比較 searchValue 。 為了保證這項功能,它會限制類型參數 T 來實作 IComparable<T> 介面。 程式碼會 CompareTo 使用 方法,而不是 = 運算子,因為不保證提供給 T 的型別引數支援 = 運算子。

您可以使用下列程式碼來測試 findElement 程式。

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

上述呼叫 MsgBox 分別顯示 「0」、「1」 和 「-1」。

另請參閱