デリゲート (プログラミング)
デリゲート(delegate、デレゲート)とは、C#、Visual Basic .NETなどの、.NET Frameworkのプログラミング言語にある機能である。
概要
デリゲートは、オブジェクトへの参照と関数オブジェクトへの参照をペアにして持つものである。オブジェクト指向プログラミングとしては、メソッドをカプセル化するクラスとも言える。型安全であるという特徴がある。
C++の「メンバ関数を指すポインタ」や、Object Pascal(Delphi)の「インスタンスのメソッドへのポインタを格納する、メソッドポインタ」と同様のものである(DelphiもC#もアンダース・ヘルスバーグによる設計である)。また、Microsoft Visual J++も、Javaと非互換のデリゲートを導入したが、.NET Frameworkのデリゲートはこれらを発展させたものである。
主にイベント処理での活用を想定している。Javaなどでのインタフェースを利用したイベント処理と比べ、メソッド名を自由に宣言できるなどの利点がある。C#では複数のデリゲートを結合させることもでき、結合されたデリゲートを保持・呼び出すための機構としてevent
メンバが用意されている。
D言語には関数オブジェクトがあり、型としてfunctionとdelegateがある。無名関数を作る式として関数リテラルがあり、functionとdelegateのそれぞれに対応した構文がある。関数リテラルの省略構文としてラムダ式がある。functionとdelegateの違いは、作られたスコープの環境にアクセスできるかどうかで、アクセスする場合はデリゲートである必要がある。ラムダ式では内容に応じて、デリゲートである必要がある場合はデリゲートになる。
VJ++
参考
C#
C#では、次の宣言文によって「string
型の引数を1つと、int
型の戻り値を持つデリゲート」を宣言する。
delegate int SomeDelegate(string p);
そして、次のようにデリゲート型オブジェクトを生成することができる。
SomeDelegate del = new SomeDelegate(SomeMethod);
SomeDelegate del = new SomeDelegate(delegate(string p) {
return 1;
});
前者の宣言では既存のSomeMethod
メソッドをデリゲートの中身として指定しており、後者の宣言ではデリゲートの中身も同時に定義している(この書き方では、return
文によって返される値がSomeDelegate
デリゲートの戻り値に暗黙的に変換できない場合、エラーとなる)。
こうして生成したデリゲート型オブジェクトは、通常のメソッドのように直接実行することができる。
int ret = del("some string");
しかし、デリゲートの真価が発揮されるのはイベントと併用した時である。イベントは、次のように宣言する。
event SomeDelegate SomeEvent;
こうして宣言したイベントには、+=
演算子と -=
演算子によって、デリゲート(イベントハンドラ)を追加したり削除したりすることができる。
SomeEvent += new SomeDelegate(SomeEventHandler1);
SomeEvent -= new SomeDelegate(SomeEventHandler1);
イベントハンドラの追加が +=
演算子によって行われることから推測できるように、1つのイベントには複数のイベントハンドラを登録することができる。
次のようにしてイベントを起こすと、登録したイベントハンドラがまとめて実行される。
if (SomeEvent != null)
SomeEvent("some string");
実行される順番は登録順とは関係なく、未定義である。