Delegate

Delegateとは

 ・Delegateとは、メソッドを代入できる型。

  Delegate型の変数を定義すると、その変数の中にメソッドを代入できる。

 ・Delegate型の変数は、メソッドの引数に指定する事もできる

   =メソッドの引数にメソッドを指定することもできる。

Delegateの定義

 ・修飾子 delegate 戻り値の型 delegate(引数の型 引数...)

 ex) public delegate string delegateNamefnc(string str,int count)

 (*)上記は、string型の値を返す、引数にstring型、int 型の変数を持つメソッドを

  代入できるdelegate

マルチキャストDelegate

 ・delegate変数に+=でメソッドを代入することで、delegate変数内に複数の

  メソッドを代入することが可能。

 ・-=で、メソッドを削除することも可能。

 ・追加した順番にメソッドが実行される。

 ・戻り値を持つメソッドを複数追加した場合、最後に実行されたメソッドの

  戻り値のみが返される。

■匿名メソッド

 delegateに代入するメソッドは既に定義されているメソッドを代入することが

 できるが、その場限りでしか使わないメソッドの場合は、代入のタイミングで

 匿名メソッドにて定義することもできる。

■型パラメータを利用した宣言

 以下の様にDelegateの宣言と、そのDelegate型の変数の宣言を纏めて、以下の様に

 簡易に記述することができる。

 戻り値のあるDelegateの場合Func<T, TResult>

  →T型の引数を持ち、TResult型の戻り値を持つDelegate

 戻り値のないDelegateの場合Action<T>

  →T型の引数を持ち、戻り値を持たないDeleate 

   戻り値も引数もないDelegateの場合Action<>

 (*)Tは、16個まで定義可能

ex)

 // intを引数にとってintを返すメソッドを参照するデリゲート型
 public delegate int TestMethod(int value);

 // TestMethodデリゲートにTestクラスのForTestMethodメソッドを参照する
 TestMethod iremono= Test.ForTestMethod;

 この場合、以下のように宣言できる。

 Func<int, int> TestMethod= Test.ForTestMethod;

 // 引数がなく、intを返すメソッドを参照するDelegate

 Func<int> TestMethod= Test.ForTestMethod;

 // ラムダ式で書くと

 Func<int> TestMethod = () => intValue;

 Func<int> TestMethod = _ => intValue;

 引数がないことは、()または_で記述する。

(*)https://qiita.com/RyotaMurohoshi/items/740151bd772889cf07de