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
関連項目
.NET