最終更新:2022-08-19 (金) 12:46:54 (578d)
C♯/デリゲート
https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/delegates/
概要
- デリゲートは、メソッドへの参照を保持できるクラスです
- 関数を変数に入れて使うイメージ。そのための型。
- 関数ポインタとの違いはマルチキャストもできるところ。
- さまざまなメソッドを呼び出すために使用できるが、あくまで同じ戻り値、同じ引数のメソッドに限られる。
- デリゲートは、他のメソッドへの引数としてメソッドを渡すために使用されます。
デリゲートの特徴
- デリゲートは、C++ の関数ポインターに似ていますが、タイプ セーフです。
- デリゲートを使用すると、メソッドをパラメーターとして渡すことができます。
- デリゲートは、コールバック メソッドを定義するのに使用できます。
- デリゲートは連結でき、たとえば、複数のメソッドを 1 つのイベントで呼び出すことができます。
- マルチキャストデリゲート
- メソッドは、デリゲートのシグネチャに正確に一致する必要がありません。
- C♯ 2.0 で、匿名メソッドの概念が導入され、別個に定義されたメソッドの代わりにコード ブロックをパラメーターとして渡せるようになりました。
- C♯ 3.0 ではラムダ式が導入され、インライン コード ブロックをより簡潔に記述できるようになりました。 匿名メソッドと (特定のコンテキストにおける) ラムダ式はどちらも、デリゲート型にコンパイルされます。 これらの機能は総称して、匿名関数と呼ばれるようになりました。
使い方
デリゲート型 デリゲート変数 = new デリゲート型(呼び出す関数);
メモ
- C♯ 1.1? までは、 SomeDelegate? a = new SomeDelegate?(A); と言うように、new が必要でしたが、 C♯ 2.0 からは、 SomeDelegate? a = A; と言うように、メソッドからデリゲートへの暗黙の変換が出来るようになりました。
宣言
public delegate 戻り値のデータ型 デリゲートの名前 (仮引数リスト);
例
public delegate void ShowMessageDelegate(string msg);//デリゲート型を宣言 //デリゲートから呼び出す関数。引数はデリゲートと同じである必要がある void ConcreteShowMessage(string msg) { Console.WriteLine(msg); } //コンストラクタの引数に登録したいメソッドを書く //デリゲート型 デリゲート変数 = new デリゲート型(呼び出す関数); ShowMessageDelegate ShowMessage = new ShowMessageDelegate(ConcreteShowMessage); ShowMessage("hello, from delegate!");//呼び出し
- デリゲートは用途も関数ポインタとほとんど同じで、 述語やイベントハンドラ等に利用
- C# 2.0 からは、 SomeDelegate? a = A; と言うように、メソッドからデリゲートへの暗黙の変換が出来るようになった。