次の方法で共有


Delegate ステートメント

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

構文

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

部品

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

- パブリック。 デリゲートを宣言する要素にアクセスできるコードは、その要素にアクセスできます。
- 保護されています。 デリゲートのクラスまたは派生クラス内のコードのみがアクセスできます。
- フレンド。 デリゲートにアクセスできるのは、同じアセンブリ内のコードだけです。
- プライベート。 デリゲートを宣言する要素内のコードのみがアクセスできます。

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

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

注釈

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

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

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

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

AddressOf [expression.]methodname

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

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

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

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

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

次の例では、 Delegate ステートメントを使用して、2 つの数値を操作し、数値を返すデリゲートを宣言します。 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

こちらも参照ください