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) 上叫用型別參考。
範例
描述
下列範例會定義泛型 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"。
請參閱
工作
HOW TO:定義可以在不同資料型別上提供完全相同功能的類別 (Visual Basic)