最終更新:2019-10-21 (月) 16:25:43 (25d)  

C♯/デリゲート はてなブックマークを見る
Top / C♯ / デリゲート

概要

  • デリゲートは、メソッドへの参照を保持できるクラスです
    • 関数を変数に入れて使うイメージ。そのための型。
  • 関数ポインタとの違いはマルチキャストもできるところ。
  • さまざまなメソッドを呼び出すために使用できるが、あくまで同じ戻り値、同じ引数のメソッドに限られる。
  • デリゲートは、他のメソッドへの引数としてメソッドを渡すために使用されます。

デリゲートの特徴

  • デリゲートは、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; と言うように、メソッドからデリゲートへの暗黙の変換が出来るようになった。

キーワード

参考