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)」を参照してください。

使用例

次の例では、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)