デリゲート (C# プログラミング ガイド)
デリゲートは、メソッド シグネチャを定義する型です。デリゲートをインスタンス化するときは、互換性のあるシグネチャを持つ任意のメソッドにそのインスタンスを関連付けることができます。メソッドは、デリゲート インスタンスを使用して起動する (呼び出す) ことができます。
デリゲートは、他のメソッドへの引数としてメソッドを渡すために使用されます。イベント ハンドラーは、デリゲートを介して呼び出されるメソッドにすぎません。カスタム メソッドを作成して、特定のイベントの発生時に、作成したメソッドが Windows コントロールなどのクラスから呼び出されるようにできます。次の例にデリゲート宣言を示します。
public delegate int PerformCalculation(int x, int y);
アクセス可能なクラスまたは構造体のメソッドのうち、デリゲートのシグネチャ (戻り値の型とパラメーターから成る) と一致するメソッドは、そのデリゲートに割り当てることができます。メソッドは、静的メソッドとインスタンス メソッドのいずれかにできます。このため、メソッド呼び出しをプログラムによって変更でき、また新しいコードを既存のクラスに接続することもできます。デリゲートのシグネチャを知っている限り、独自のメソッドを割り当てることができます。
[!メモ]
メソッドのオーバーロードのコンテキストでは、メソッドのシグネチャに戻り値は含まれません。しかしデリゲートのコンテキストでは、シグネチャに戻り値が含まれます。つまり、メソッドにはデリゲートと同じ戻り値が必要です。
このようにメソッドをパラメーターとして参照できるため、デリゲートはコールバック メソッドを定義するのに最適です。たとえば、2 つのオブジェクトを比較するメソッドへの参照は、並べ替えのアルゴリズムへの引数として渡すことができます。比較を行うコードは独立したプロシージャであるため、並べ替えのアルゴリズムはより一般的な方法で記述できます。
デリゲートの概要
デリゲートには、次の特徴があります。
デリゲートは、C++ の関数ポインターに似ていますが、タイプ セーフです。
デリゲートを使用すると、メソッドをパラメーターとして渡すことができます。
デリゲートは、コールバック メソッドを定義するのに使用できます。
デリゲートは連結でき、たとえば、複数のメソッドを 1 つのイベントで呼び出すことができます。
メソッドは、デリゲートのシグネチャに正確に一致する必要がありません。詳細については、「デリゲートの分散の使用 (C# および Visual Basic)」を参照してください。
C# Version 2.0 で、匿名メソッドの概念が導入され、別個に定義されたメソッドの代わりにコード ブロックをパラメーターとして渡せるようになりました。C# 3.0 ではラムダ式が導入され、インライン コード ブロックをより簡潔に記述できるようになりました。匿名メソッドと (特定のコンテキストにおける) ラムダ式はどちらも、デリゲート型にコンパイルされます。これらの機能は総称して、匿名関数と呼ばれるようになりました。ラムダ式の詳細については、「匿名関数 (C# プログラミング ガイド)」を参照してください。
このセクションの内容
C# 言語仕様
詳細については、「C# 言語仕様」を参照してください。言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。
参考書籍の該当する章
『C# 3.0 Cookbook, Third Edition: More than 250 solutions for C# 3.0 programmers』の「Delegates, Events, and Lambda Expressions」
『Learning C# 3.0: Master the fundamentals of C# 3.0』の「Delegates and Events」