Delegate ステートメント

デリゲートを宣言します。デリゲートとは、型の Shared メソッド、またはオブジェクトのインスタンス メソッドを参照する参照型です。パラメーターの型と戻り値の型が一致するプロシージャを使って、このデリゲート クラスのインスタンスを作成できます。デリゲート インスタンスの作成後は、そのインスタンスを経由してプロシージャを起動できます。

[ <attrlist> ] [ accessmodifier ] _
[ Shadows ] Delegate [ Sub | Function ] name [( Of typeparamlist )] [([ parameterlist ])] [ As type ]

指定項目

語句

定義

attrlist

省略可能です。このデリゲートに適用される属性の一覧を指定します。複数の属性を指定するときは、コンマ (,) で区切ります。属性リスト (Visual Basic) は、山かっこ (< および >) で囲む必要があります。

accessmodifier

省略可能です。どのようなコードからデリゲートにアクセスできるのかを指定します。次のいずれかになります。

  • Publicデリゲートを宣言した要素にアクセスできるすべてのコードがアクセスできます。

  • Protectedデリゲートのクラス内のコード、または派生クラスのみがアクセスできます。

  • Friendデリゲートと同じアセンブリ内のコードだけがアクセスできます。

  • Privateデリゲートを宣言した要素内のコードだけがアクセスできます。

Protected Friend と指定すると、デリゲートのクラス、その派生クラス、または同じアセンブリ内のコードからのみアクセスできます。

Shadows

省略可能です。このデリゲートが、基本クラスにある、同じ名前を持つプログラミング要素、またはオーバーロードされる要素を宣言し直すことを示します。宣言された要素は、他の任意の種類の要素でシャドウできます。

シャドウされた要素は、その要素をシャドウする派生クラスからは使用できません。ただし、シャドウする要素がアクセスできない要素の場合は例外です。たとえば、Private 要素が基本クラスの要素をシャドウした場合、その Private 要素へのアクセス許可を持たないコードは、基本クラスの要素へ代わりにアクセスします。

Sub

省略できます。ただし、Sub か Function のどちらかを指定する必要があります。指定するプロシージャが、値を返さないデリゲートの Sub プロシージャとして宣言されることを示します。

Function

省略できます。ただし、Sub か Function のどちらかを指定する必要があります。指定するプロシージャが、値を返すデリゲートの Function プロシージャとして宣言されることを示します。

name

必ず指定します。デリゲート型の名前を指定します。デリゲート型の標準的な名前付け規則に従って名前を付けます。

typeparamlist

省略可能です。このデリゲートの型パラメーターを一覧表示します。複数の型パラメーターがある場合は、コンマ (,) で区切られます。必要に応じて、ジェネリックの In 修飾子や Out 修飾子を使用して、それぞれの型パラメーターをバリアントとして宣言できます。型リスト (Visual Basic) はかっこで囲み、冒頭に Of キーワードを付けます。

parameterlist

省略可能です。プロシージャが呼び出されたときに渡されるパラメーターのリストです。パラメーターの一覧 (Visual Basic) はかっこで囲む必要があります。

type

Function プロシージャを指定する場合は、必ず指定します。戻り値のデータ型を指定します。

解説

Delegate ステートメントでは、デリゲート クラスのパラメーターの型と戻り値の型を定義します。パラメーターの型と戻り値の型が一致するプロシージャを使って、このデリゲート クラスのインスタンスを作成できます。デリゲート インスタンスの作成後は、デリゲートの Invoke メソッドを呼び出すことで、そのインスタンスを経由してプロシージャを起動できます。

デリゲートは、名前空間、モジュール、クラス、構造体レベルで宣言できますが、プロシージャ内では宣言できません。

各デリゲート クラスでは、オブジェクト メソッドの仕様を渡すコンストラクターを定義します。デリゲート コンストラクターに渡す引数は、メソッドへの参照、またはラムダ式である必要があります。

メソッドへの参照を指定するには、次の構文を使用します。

AddressOf [expression.]methodname

コンパイル時の expression の型は、シグネチャがデリゲート クラスのシグネチャと同じで、指定された名前のメソッドを持つクラスまたはインターフェイスである必要があります。methodname は、共有メソッドまたはインスタンス メソッドのいずれかにできます。クラスの既定メソッドに対してデリゲートを作成する場合も、methodname は省略できません。

ラムダ式を指定するには、次の構文を使用します。

Function ([parm As type, parm2 As type2, ...]) expression

関数のシグネチャは、デリゲート型のシグネチャと一致している必要があります。ラムダ式の詳細については、「ラムダ式 (Visual Basic)」を参照してください。

デリゲートの詳細については、「デリゲート (Visual Basic)」を参照してください。

使用例

次の例では、Delegate ステートメントを使って、2 つの数字を操作して数字を返すデリゲートを宣言します。DelegateTest メソッドはこのデリゲートの型のインスタンスを受け取り、デリゲートを使って 1 組の数字を操作します。

Delegate Function MathOperator( 
    ByVal x As Double, 
    ByVal y As Double 
) As Double

Function AddNumbers( 
    ByVal x As Double, 
    ByVal y As Double 
) As Double
    Return x + y
End Function

Function SubtractNumbers( 
    ByVal x As Double, 
    ByVal y As Double
) As Double
    Return x - y
End Function

Sub DelegateTest( 
    ByVal x As Double, 
    ByVal op As MathOperator, 
    ByVal y As Double 
)
    Dim ret As Double
    ret = op.Invoke(x, y) ' Call the method.
    MsgBox(ret)
End Sub

Protected Sub Test()
    DelegateTest(5, AddressOf AddNumbers, 3)
    DelegateTest(9, AddressOf SubtractNumbers, 3)
End Sub

参照

処理手順

方法: ジェネリック クラスを使用する (Visual Basic)

関連項目

AddressOf 演算子 (Visual Basic)

Of 句 (Visual Basic)

In (ジェネリック修飾子) (Visual Basic)

Out (ジェネリック修飾子) (Visual Basic)

概念

Visual Basic におけるジェネリック型 (Visual Basic)

その他の技術情報

デリゲート (Visual Basic)

共変性と反変性 (C# および Visual Basic)