デリゲートと AddressOf 演算子
更新 : 2007 年 11 月
デリゲートは、ほかのオブジェクトのメソッドを呼び出すために使用できるオブジェクトです。デリゲートは他のプログラミング言語で使用される関数ポインタに似ているため、タイプ セーフ関数ポインタと説明されることがあります。しかし、関数のポインタとは異なり、Visual Basic のデリゲートは、System.Delegate クラスに基づく参照型です。デリゲートは、共有メソッド (特定のクラスのインスタンスがなくても呼び出すことのできるメソッド) とインスタンス メソッドの両方を参照できます。
デリゲートとイベント
デリゲートは、呼び出し側プロシージャと呼び出されるプロシージャの間の媒介手段が必要な状況で役立ちます。たとえば、イベントを発生させるオブジェクトが異なる状況で別個のイベント ハンドラを呼び出さなければならない場合があります。ただし、イベントを発生させるオブジェクトからは、どのイベント ハンドラがどのイベントを処理するのかをあらかじめ把握できません。Visual Basic では、AddHandler ステートメントを使用する場合、デリゲートを作成して、イベント ハンドラをイベントに動的に関連付けることができます。実行時に、デリゲートによって適切なイベント ハンドラに呼び出しが転送されます。
独自のデリゲートを作成することもできますが、ほとんどの場合、デリゲートの作成と詳細の管理は Visual Basic によって自動的に行われます。たとえば、Event ステートメントは、Event ステートメントを含むクラスの入れ子のクラスとして、<EventName>EventHandler という名前のデリゲート クラスを暗黙に定義します。定義の時はイベントと同じシグネチャを使用します。AddressOf ステートメントは、デリゲートのインスタンスを暗黙に作成します。たとえば、次の 2 つのコード行は同等です。
AddHandler Button1.Click, AddressOf Me.Button1_Click
' The previous line of code is shorthand for the next line of code.
AddHandler Button1.Click, New EventHandler(AddressOf Button1_Click)
デリゲートの種類をコンパイラでコンテキストから判断できる場合は、簡単なデリゲートの作成方法を使用できます。
既存の種類のデリゲートを使用するイベントの宣言
状況によっては、基になるデリゲートとして既存の種類のデリゲートを使用するイベントを宣言しなければならない場合があります。その方法は次のとおりです。
Delegate Sub DelegateType()
Event AnEvent As DelegateType
これは、同じハンドラに複数のイベントをルーティングする場合に役立ちます。
デリゲート変数とパラメータ
フリー スレッドまたはコンパイル時にさまざまな関数を呼び出す必要のあるプロシージャなど、イベントに関連しないほかのタスクにデリゲートを使用できます。
たとえば、自動車の名前のリスト ボックスを含む、項目別広告のアプリケーションがあるとします。広告はタイトルで並べ替えられます。通常、タイトルは自動車の型式です。問題が発生する可能性があるのは、型式の前に年式が含まれている自動車があるときです。問題になるのは、リスト ボックスに組み込まれた並べ替え機能の並べ替えの基準が文字コードだけであることです。このため、日付で始まるすべての広告が最初に配置され、その後に型式で始まる広告が配置されます。
この問題を解決するために、クラスに並べ替えプロシージャを作成できます。このプロシージャは、ほとんどのリスト ボックスに対応する標準的なアルファベット順の並べ替えを使用しますが、実行時に自動車広告用のカスタム並べ替えプロシージャに切り替えることができます。このプロシージャを作成するには、デリゲートを使用して実行時にカスタム並べ替えプロシージャを並べ替えクラスに渡します。
各デリゲート クラスでは、オブジェクト メソッドの仕様を渡すコンストラクタを定義します。デリゲート コンストラクタに渡す引数は、メソッドへの参照、またはラムダ式である必要があります。
メソッドへの参照を指定するには、次の構文を使用します。
AddressOf [expression.]methodName
コンパイル時の expression の型は、シグネチャがデリゲート クラスのシグネチャと同じで、指定された名前のメソッドを持つクラスまたはインターフェイスである必要があります。methodName は、共有メソッドまたはインスタンス メソッドのいずれかにできます。クラスの既定メソッドに対してデリゲートを作成する場合も、methodName は省略できません。
ラムダ式を指定するには、次の構文を使用します。
Function ([parm As type, parm2 As type2, ...]) expression
関数のシグネチャは、デリゲート型のシグネチャと一致している必要があります。ラムダ式の詳細については、「ラムダ式」を参照してください。
参照
処理手順
方法 : Visual Basic でプロシージャを別のプロシージャに渡す