デリゲート (C# プログラミング ガイド)Delegates (C# Programming Guide)

デリゲートは、特定のパラメーター リストおよび戻り値の型を使用して、メソッドへの参照を表す型です。A delegate is a type that represents references to methods with a particular parameter list and return type. デリゲートをインスタンス化するときは、互換性のあるシグネチャと戻り値の型を持つ任意のメソッドにそのインスタンスを関連付けることができます。When you instantiate a delegate, you can associate its instance with any method with a compatible signature and return type. メソッドは、デリゲート インスタンスを使用して起動する (呼び出す) ことができます。You can invoke (or call) the method through the delegate instance.

デリゲートは、他のメソッドへの引数としてメソッドを渡すために使用されます。Delegates are used to pass methods as arguments to other methods. イベント ハンドラーは、デリゲートを介して呼び出されるメソッドにすぎません。Event handlers are nothing more than methods that are invoked through delegates. カスタム メソッドを作成して、特定のイベントの発生時に、作成したメソッドが Windows コントロールなどのクラスから呼び出されるようにできます。You create a custom method, and a class such as a windows control can call your method when a certain event occurs. 次の例にデリゲート宣言を示します。The following example shows a delegate declaration:

public delegate int PerformCalculation(int x, int y);

デリゲート型と一致するアクセス可能なクラスまたは構造体のメソッドはすべて、デリゲートに代入できます。Any method from any accessible class or struct that matches the delegate type can be assigned to the delegate. メソッドは、静的メソッドとインスタンス メソッドのいずれかにできます。The method can be either static or an instance method. このため、メソッド呼び出しをプログラムによって変更でき、また新しいコードを既存のクラスに接続することもできます。This makes it possible to programmatically change method calls, and also plug new code into existing classes.


メソッドのオーバーロードのコンテキストでは、メソッドのシグネチャに戻り値は含まれません。In the context of method overloading, the signature of a method does not include the return value. しかしデリゲートのコンテキストでは、シグネチャに戻り値が含まれます。But in the context of delegates, the signature does include the return value. つまり、メソッドにはデリゲートと同じ戻り値の型が必要です。In other words, a method must have the same return type as the delegate.

このようにメソッドをパラメーターとして参照できるため、デリゲートはコールバック メソッドを定義するのに最適です。This ability to refer to a method as a parameter makes delegates ideal for defining callback methods. たとえば、2 つのオブジェクトを比較するメソッドへの参照は、並べ替えのアルゴリズムへの引数として渡すことができます。For example, a reference to a method that compares two objects could be passed as an argument to a sort algorithm. 比較を行うコードは独立したプロシージャであるため、並べ替えのアルゴリズムはより一般的な方法で記述できます。Because the comparison code is in a separate procedure, the sort algorithm can be written in a more general way.

デリゲートの概要Delegates Overview

デリゲートには、次の特徴があります。Delegates have the following properties:

  • デリゲートは C++ 関数ポインターと似ていますが、デリゲートは完全なオブジェクト指向です。また、メンバー関数への C++ ポインターとは異なり、デリゲートではオブジェクト インスタンスとメソッドの両方をカプセル化します。Delegates are similar to C++ function pointers, but delegates are fully object-oriented, and unlike C++ pointers to member functions, delegates encapsulate both an object instance and a method.

  • デリゲートを使用すると、メソッドをパラメーターとして渡すことができます。Delegates allow methods to be passed as parameters.

  • デリゲートは、コールバック メソッドを定義するのに使用できます。Delegates can be used to define callback methods.

  • デリゲートは連結でき、たとえば、複数のメソッドを 1 つのイベントで呼び出すことができます。Delegates can be chained together; for example, multiple methods can be called on a single event.

  • メソッドは、デリゲート型に正確に一致する必要がありません。Methods do not have to match the delegate type exactly. 詳細については、「デリゲートの分散の使用」を参照してください。For more information, see Using Variance in Delegates.

  • C# バージョン 2.0 では匿名メソッドの概念が導入されました。これを使用すると、別個に定義されたメソッドの代わりに、コード ブロックをパラメーターとして渡すことができます。C# version 2.0 introduced the concept of anonymous methods, which allow code blocks to be passed as parameters in place of a separately defined method. C# 3.0 ではラムダ式が導入され、インライン コード ブロックをより簡潔に記述できるようになりました。C# 3.0 introduced lambda expressions as a more concise way of writing inline code blocks. 匿名メソッドと (特定のコンテキストにおける) ラムダ式はどちらも、デリゲート型にコンパイルされます。Both anonymous methods and lambda expressions (in certain contexts) are compiled to delegate types. これらの機能は総称して、匿名関数と呼ばれるようになりました。Together, these features are now known as anonymous functions. ラムダ式について詳しくは、「ラムダ式」をご覧ください。For more information about lambda expressions, see Lambda expressions.

このセクションの内容In This Section

C# 言語仕様C# Language Specification

詳細については、「C# 言語の仕様」の「デリゲート」を参照してください。For more information, see Delegates in the C# Language Specification. 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。The language specification is the definitive source for C# syntax and usage.

Delegates, Events, and Lambda Expressions (デリゲート、イベント、およびラムダ式)」(『C# 3.0 Cookbook, Third Edition: More than 250 solutions for C# 3.0 programmers (C# 3.0 クックブック (第 3 版): C# 3.0 プログラマ向けの 250 以上のソリューション)』)Delegates, Events, and Lambda Expressions in C# 3.0 Cookbook, Third Edition: More than 250 solutions for C# 3.0 programmers

デリゲートとイベント」(『Learning C# 3.0: Master the fundamentals of C# 3.0 (C# 3.0 の学習: C# 3.0 の基礎を習得)』)Delegates and Events in Learning C# 3.0: Master the fundamentals of C# 3.0

関連項目See also