共用方式為


Visual Basic 中的泛型程序

「泛型程序」(Generic Procedure),亦稱為「泛型方法」(Generic Method),是指至少使用一個型別參數定義的程序。它可讓呼叫程式碼在每次呼叫程序時,根據需求調整資料型別。

如果某個程序只是在泛型類別或泛型結構內定義,則該程序不一定是泛型。若要成為泛型,除了可能採用的一般參數以外,程序至少必須採用一個型別參數。泛型類別或結構可能含有非泛型程序,而非泛型類別、結構或模組也可能含有泛型程序。

泛型程序可以在一般參數清單、傳回型別 (如果有的話) 和程序程式碼中使用自己的型別參數。

型別推斷

您可以呼叫泛型程序,但不提供任何型別引數。如果您用這種方式呼叫,編譯器 (Compiler) 就會嘗試判斷適當的資料型別,以傳遞至程序的型別引數。這就稱為「型別推斷」(Type Inference)。下列程式碼將示範一則呼叫,其中編譯器會推斷出它應該傳遞型別 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

您可以只透過省略所有型別引數,叫用 (Invoke) 型別參考。如果您提供一個型別引數,就必須提供所有引數。

只有泛型程序才支援型別參考。您無法在泛型類別、結構、介面或委派 (Delegate) 上叫用型別參考。

範例

ms235246.collapse_all(zh-tw,VS.110).gif描述

下列範例會定義泛型 Function 程序,以便找出陣列中的特定元素。它會定義一個型別參數並使用此參數在參數清單中建構兩個參數。

ms235246.collapse_all(zh-tw,VS.110).gif程式碼

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

ms235246.collapse_all(zh-tw,VS.110).gif註解

上述範例需要能夠根據 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"。

請參閱

工作

HOW TO:定義可以在不同資料型別上提供完全相同功能的類別 (Visual Basic)

HOW TO:使用泛型類別 (Visual Basic)

參考

型別清單 (Visual Basic)

參數清單 (Visual Basic)

概念

Visual Basic 中的泛型型別 (Visual Basic)

Visual Basic 中的程序

程序參數和引數 (Visual Basic)