次の方法で共有


Visual Basic の汎用プロシージャ

ジェネリック プロシージャは、ジェネリック メソッドとも呼ばれ、少なくとも 1 つの型パラメーターで定義されたプロシージャです。 これにより、呼び出し元のコードは、プロシージャを呼び出すたびに、その要件に合わせてデータ型を調整できます。

プロシージャは、ジェネリック クラスまたはジェネリック構造体内で定義されているだけではジェネリックではありません。 ジェネリックにするには、プロシージャが受け取る通常のパラメーターに加えて、少なくとも 1 つの型パラメーターを受け取る必要があります。 ジェネリック クラスまたは構造体には非ジェネリック プロシージャを含めることができます。また、非ジェネリック クラス、構造体、またはモジュールにはジェネリック プロシージャを含めることができます。

ジェネリック プロシージャは、通常のパラメーター リスト、戻り値の型 (ある場合)、およびプロシージャ コードで型パラメーターを使用できます。

型推論

ジェネリック プロシージャは、型引数をまったく指定せずに呼び出すことができます。 この方法で呼び出すと、コンパイラはプロシージャの型引数に渡す適切なデータ型を決定しようとします。 これは 型推論と呼ばれます。 次のコードは、型パラメーター Stringに型tを渡す必要があるとコンパイラが推測する呼び出しを示しています。

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

コンパイラは、呼び出しのコンテキストから型引数を推論できない場合、エラーを報告します。 このようなエラーの原因の 1 つは、配列ランクの不一致です。 たとえば、通常のパラメーターを型パラメーターの配列として定義するとします。 異なるランク (次元数) の配列を指定するジェネリック プロシージャを呼び出すと、型の推論が失敗します。 次のコードは、1 次元配列を必要とするプロシージャに 2 次元配列が渡される呼び出しを示しています。

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

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

型推論は、すべての型引数を省略することによってのみ呼び出すことができます。 1 つの型引数を指定する場合は、それらすべてを指定する必要があります。

型推論は、ジェネリック プロシージャでのみサポートされます。 ジェネリック クラス、構造体、インターフェイス、またはデリゲートに対して型推論を呼び出すことはできません。

説明

次の例では、配列内の特定の要素を検索するジェネリック Function プロシージャを定義します。 1 つの型パラメーターを定義し、それを使用してパラメーター リストに 2 つのパラメーターを作成します。

コード

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

コメント

前の例では、searchValueの各要素とsearchArrayを比較する機能が必要です。 この機能を保証するために、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" が表示されます。

こちらも参照ください