Delegate ステートメントDelegate Statement

デリゲートの宣言に使用します。Used to declare a delegate. デリゲートは、型の Shared メソッドまたはオブジェクトのインスタンス メソッドを参照する参照型です。A delegate is a reference type that refers to a Shared method of a type or to an instance method of an object. パラメーターおよび戻り値の型が一致するプロシージャを使用すると、このデリゲート クラスのインスタンスを作成できます。Any procedure with matching parameter and return types can be used to create an instance of this delegate class. このプロシージャは、後でデリゲート インスタンスを使用して呼び出すことができます。The procedure can then later be invoked by means of the delegate instance.

構文Syntax

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

指定項目Parts

用語Term 定義Definition
attrlist 任意。Optional. このデリゲートに適用される属性の一覧です。List of attributes that apply to this delegate. 複数の属性を指定するときは、コンマで区切ります。Multiple attributes are separated by commas. 属性リストは山かっこ ("<" および ">") で囲む必要があります。You must enclose the Attribute List in angle brackets ("<" and ">").
accessmodifier 任意。Optional. どのようなコードからデリゲートにアクセスできるのかを指定します。Specifies what code can access the delegate. 次のいずれかの値を指定します。Can be one of the following:

- Public- Public. このデリゲートを宣言している要素にアクセス可能なすべてのコードからアクセスできます。Any code that can access the element that declares the delegate can access it.
- Protected- Protected. デリゲートのクラスまたは派生クラス内のコードからのみアクセスできます。Only code within the delegate's class or a derived class can access it.
- Friend- Friend. デリゲートには同じアセンブリ内のコードからのみアクセスできます。Only code within the same assembly can access the delegate.
- Private- Private. このデリゲートを宣言している要素内のコードからのみアクセスできます。Only code within the element that declares the delegate can access it.

- Protected Friend デリゲートのクラス、派生クラス、または同じアセンブリ内のコードからのみ、デリゲートにアクセスできます。- Protected Friend Only code within the delegate's class, a derived class, or the same assembly can access the delegate.
- Private Protected 同じアセンブリ内のデリゲートのクラスまたは派生クラス内のコードからのみ、デリゲートにアクセスできます。- Private Protected Only code within the delegate's class or in a derived class in the same assembly can access the delegate.
Shadows 任意。Optional. このデリゲートが、基底クラスにある、同じ名前を持つプログラミング要素、またはオーバーロードされる要素のセットを宣言し直して非表示にすることを示します。Indicates that this delegate redeclares and hides an identically named programming element, or set of overloaded elements, in a base class. 宣言された要素は、他の任意の種類の要素でシャドウできます。You can shadow any kind of declared element with any other kind.

シャドウされた要素は、その要素をシャドウする派生クラスからは使用できません。ただし、シャドウする要素がアクセスできない要素の場合は例外です。A shadowed element is unavailable from within the derived class that shadows it, except from where the shadowing element is inaccessible. たとえば、Private 要素が基底クラスの要素をシャドウすると、Private 要素へのアクセス許可を持たないコードが、代わりに基底クラスの要素にアクセスします。For example, if a Private element shadows a base class element, code that does not have permission to access the Private element accesses the base class element instead.
Sub 省略可能ですが、Sub または Function のいずれかを指定する必要があります。Optional, but either Sub or Function must appear. このプロシージャを、値を返さないデリゲート Sub プロシージャとして宣言します。Declares this procedure as a delegate Sub procedure that does not return a value.
Function 省略可能ですが、Sub または Function のいずれかを指定する必要があります。Optional, but either Sub or Function must appear. このプロシージャを、値を返すデリゲート Function プロシージャとして宣言します。Declares this procedure as a delegate Function procedure that returns a value.
name 必須です。Required. デリゲート型の名前です。変数の標準的な名前付け規則に従います。Name of the delegate type; follows standard variable naming conventions.
typeparamlist 任意。Optional. このデリゲートの型パラメーターのリスト。List of type parameters for this delegate. 複数の型パラメーターはコンマで区切ります。Multiple type parameters are separated by commas. 必要に応じて、In および Out ジェネリック修飾子を使用して、各型パラメーターをバリアントとして宣言できます。Optionally, each type parameter can be declared variant by using In and Out generic modifiers. 型リストをかっこで囲み、Of キーワードと共に導入する必要があります。You must enclose the Type List in parentheses and introduce it with the Of keyword.
parameterlist 任意。Optional. 呼び出されたときにプロシージャに渡されるパラメーターのリスト。List of parameters that are passed to the procedure when it is called. パラメーター リストはかっこで囲む必要があります。You must enclose the Parameter List in parentheses.
type Function プロシージャを指定する場合は、必ず指定します。Required if you specify a Function procedure. 戻り値のデータ型。Data type of the return value.

RemarksRemarks

Delegate ステートメントでは、デリゲート クラスのパラメーターと戻り値の型を定義します。The Delegate statement defines the parameter and return types of a delegate class. パラメーターおよび戻り値の型が一致するプロシージャを使用すると、このデリゲート クラスのインスタンスを作成できます。Any procedure with matching parameters and return types can be used to create an instance of this delegate class. このプロシージャは、デリゲートの Invoke メソッドを呼び出すことによって、後でデリゲート インスタンスを使用して呼び出すことができます。The procedure can then later be invoked by means of the delegate instance, by calling the delegate's Invoke method.

デリゲートは、名前空間、モジュール、クラス、または構造体レベルで宣言できますが、プロシージャ内では宣言できません。Delegates can be declared at the namespace, module, class, or structure level, but not within a procedure.

各デリゲート クラスでは、オブジェクト メソッドの仕様を渡すコンストラクターを定義します。Each delegate class defines a constructor that is passed the specification of an object method. デリゲート コンス トラクターに渡す引数は、メソッドへの参照、またはラムダ式である必要があります。An argument to a delegate constructor must be a reference to a method, or a lambda expression.

メソッドへの参照を指定するには、次の構文を使用します。To specify a reference to a method, use the following syntax:

AddressOf [expression.]methodnameAddressOf [expression.]methodname

コンパイル時の expression の型は、シグネチャがデリゲート クラスのシグネチャと同じで、指定された名前のメソッドを持つクラスまたはインターフェイスである必要があります。The compile-time type of the expression must be the name of a class or an interface that contains a method of the specified name whose signature matches the signature of the delegate class. methodname は、共有メソッドまたはインスタンス メソッドのいずれかにできます。The methodname can be either a shared method or an instance method. クラスの既定メソッドに対してデリゲートを作成する場合も、methodname は省略できません。The methodname is not optional, even if you create a delegate for the default method of the class.

ラムダ式を指定するには、次の構文を使用します。To specify a lambda expression, use the following syntax:

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

関数のシグネチャは、デリゲート型のシグネチャと一致している必要があります。The signature of the function must match that of the delegate type. ラムダ式について詳しくは、「ラムダ式」をご覧ください。For more information about lambda expressions, see Lambda Expressions.

デリゲートの詳細については、「デリゲート」を参照してください。For more information about delegates, see Delegates.

Example

次の例では、Delegate ステートメントを使用して、2 つの数値を演算して 1 つの数値を返すためのデリゲートを宣言します。The following example uses the Delegate statement to declare a delegate for operating on two numbers and returning a number. DelegateTest メソッドは、この型のデリゲートのインスタンスを受け取り、それを使用して数値のペアを演算します。The DelegateTest method takes an instance of a delegate of this type and uses it to operate on pairs of numbers.

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

関連項目See also