デリゲート (C# プログラミング ガイド)
更新 : 2007 年 11 月
delegate は、メソッド シグネチャを定義する型であり、互換性のあるシグネチャを持つ任意のメソッドに関連付けることができます。メソッドは、デリゲートを使用して起動する (呼び出す) ことができます。デリゲートは、他のメソッドへの引数としてメソッドを渡すために使用されます。イベント ハンドラは、デリゲートを介して呼び出されるメソッドにすぎません。カスタム メソッドを作成して、特定のイベントの発生時に、作成したメソッドが Windows コントロールなどのクラスから呼び出されるようにできます。次の例にデリゲート宣言を示します。
public delegate int PerformCalculation(int x, int y);
アクセス可能なクラスまたは構造体のメソッドのうち、デリゲートのシグネチャ (戻り値の型とパラメータから成る) と一致するメソッドは、そのデリゲートに割り当てることができます。メソッドは、静的メソッドとインスタンス メソッドのいずれかにできます。このため、メソッド呼び出しをプログラムによって変更でき、また新しいコードを既存のクラスに接続することもできます。デリゲートのシグネチャを知っている限り、独自のメソッドを割り当てることができます。
メモ : |
---|
メソッドのオーバーロードのコンテキストでは、メソッドのシグネチャに戻り値は含まれません。しかしデリゲートのコンテキストでは、シグネチャに戻り値が含まれます。つまり、メソッドにはデリゲートと同じ戻り値が必要です。 |
このようにメソッドをパラメータとして参照できるため、デリゲートはコールバック メソッドを定義するのに最適です。たとえば、並べ替えアルゴリズムには、2 つのオブジェクトを比較するメソッドへの参照を渡すことができます。比較コードを分離することによって、アルゴリズムをより一般的な形で記述できます。
デリゲートの概要
デリゲートには、次の特徴があります。
デリゲートは、C++ の関数ポインタに似ていますが、タイプ セーフです。
デリゲートを使用すると、メソッドをパラメータとして渡すことができます。
デリゲートは、コールバック メソッドを定義するのに使用できます。
デリゲートは連結でき、たとえば、複数のメソッドを 1 つのイベントで呼び出すことができます。
メソッドは、デリゲートのシグネチャに正確に一致する必要がありません。詳細については、「Covariance and Contravarianceデリゲートの共変性と反変性 (C# プログラミング ガイド)」を参照してください。
C# Version 2.0 で、匿名メソッドの概念が導入され、別個に定義されたメソッドの代わりにコード ブロックをパラメータとして渡せるようになりました。C# 3.0 ではラムダ式が導入され、インライン コード ブロックをより簡潔に記述できるようになりました。匿名メソッドと (特定のコンテキストにおける) ラムダ式はどちらも、デリゲート型にコンパイルされます。これらの機能は総称して、匿名関数と呼ばれるようになりました。ラムダ式の詳細については、「匿名関数 (C# プログラミング ガイド)」を参照してください。
このセクションの内容
C# 言語仕様
詳細については、「C# 言語仕様」の次のセクションを参照してください。
1.11 デリゲート
4.2.6 デリゲート型
7.5.5.3 デリゲートの呼び出し
15 デリゲート