Delegate ステートメント

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

構文

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

指定項目

用語 定義
attrlist 任意。 このデリゲートに適用される属性の一覧です。 複数の属性を指定するときは、コンマで区切ります。 属性リストは山かっこ ("<" および ">") で囲む必要があります。
accessmodifier 任意。 どのようなコードからデリゲートにアクセスできるのかを指定します。 次のいずれかの値を指定します。

- Public。 このデリゲートを宣言している要素にアクセス可能なすべてのコードからアクセスできます。
- Protected。 デリゲートのクラスまたは派生クラス内のコードからのみアクセスできます。
- Friend。 デリゲートには同じアセンブリ内のコードからのみアクセスできます。
- Private。 このデリゲートを宣言している要素内のコードからのみアクセスできます。

- Protected Friend デリゲートのクラス、派生クラス、または同じアセンブリ内のコードからのみ、デリゲートにアクセスできます。
- Private Protected 同じアセンブリ内のデリゲートのクラスまたは派生クラス内のコードからのみ、デリゲートにアクセスできます。
Shadows 任意。 このデリゲートが、基底クラスにある、同じ名前を持つプログラミング要素、またはオーバーロードされる要素のセットを宣言し直して非表示にすることを示します。 宣言された要素は、他の任意の種類の要素でシャドウできます。

シャドウされた要素は、その要素をシャドウする派生クラスからは使用できません。ただし、シャドウする要素がアクセスできない要素の場合は例外です。 たとえば、Private 要素が基底クラスの要素をシャドウすると、Private 要素へのアクセス許可を持たないコードが、代わりに基底クラスの要素にアクセスします。
Sub 省略可能ですが、Sub または Function のいずれかを指定する必要があります。 このプロシージャを、値を返さないデリゲート Sub プロシージャとして宣言します。
Function 省略可能ですが、Sub または Function のいずれかを指定する必要があります。 このプロシージャを、値を返すデリゲート Function プロシージャとして宣言します。
name 必須です。 デリゲート型の名前です。変数の標準的な名前付け規則に従います。
typeparamlist 任意。 このデリゲートの型パラメーターのリスト。 複数の型パラメーターはコンマで区切ります。 必要に応じて、In および Out ジェネリック修飾子を使用して、各型パラメーターをバリアントとして宣言できます。 型リストをかっこで囲み、Of キーワードと共に導入する必要があります。
parameterlist 任意。 呼び出されたときにプロシージャに渡されるパラメーターのリスト。 パラメーター リストはかっこで囲む必要があります。
type Function プロシージャを指定する場合は、必ず指定します。 戻り値のデータ型。

Remarks

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

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

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

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

AddressOf [expression.]methodname

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

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

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

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

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

次の例では、Delegate ステートメントを使用して、2 つの数値を演算して 1 つの数値を返すためのデリゲートを宣言します。 DelegateTest メソッドは、この型のデリゲートのインスタンスを受け取り、それを使用して数値のペアを演算します。

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

関連項目