デリゲートを宣言するために使用されます。 デリゲートは、型の 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
こちらも参照ください
.NET