【C#】デリゲート(delegate)

delegateついて説明します。
デリゲート(delegate)とは?
デリゲートとは、メソッドを参照するための型です。
↑この説明で理解できた方はこれ以降の説明は不要になりますので別の記事にお進みください。m(__)m
上記の説明だけだとピンと来ない方もいるかと思いますので
ざっくりイメージを掴むために例えるとするなら
delegateやeventは、【関数を変数のように扱うためのもの】です。
int 型の変数に5を代入する。
みたいな感じで変数に関数を設定することができます。
サンプルコードを見た方が早いと思いますので、
以下にサンプルコードを記載します。
サンプルコード1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
class hoge { public void hogeLog(string str) { Debug.Log("hogeLog" + str); } } delegate void SampleDelegate(string str); // ① public class MainProgram { static void StaticLog(string str) { Debug.Log("StaticLogk" + str); } public void Main() { hoge hoge = new hoge(); SampleDelegate SampleDelegate = delegate (string str) { }; // ② SampleDelegate += hoge.hogeLog; // ③ SampleDelegate += StaticLog; SampleDelegate += (string str) => { Debug.Log("Lamda" + str); }; SampleDelegate("CallBack"); // ④ } } |
出力結果
1 2 3 4 5 |
hogeLogCallBack StaticLogkCallBack LamdaCallBack |
サンプルコードを1つずつ解説していきます。(サンプルコードの①〜③)
最初に①です。
①は、返り値のないstring型の引数を受け取るメソッドを参照することのできるデリゲートを定義しています。
②は、メソッドを参照するデリゲートをインスタンス化しています。
③は、デリゲートに各メソッドを登録しています。
【+=】を初めて見たときになんでメソッドを足しているの?
ってなるかもしれませんが、これはC#特有の演算子のオーバーロードです。
今回の場合はデリゲートに各メソッドを登録しています。
ここで、じゃあ【-=】はできるの?って疑問が出るかもしれませんが、できます。
【-=】の場合は、各メソッドの登録を破棄します。
④でインスタンス化されているデリゲートに【返り値のないstring型の引数を受け取るメソッド】の参照が複数登録されているのでデリゲートに文字列を渡して発火させています。
おまけ
今回のサンプルコードの②でオブジェクトの初期化子を利用すれば
④の発火タイミングで4つのメソッドの処理を走らせることが可能です。
まとめ
・デリゲートとは、メソッドを参照するための型なんだな〜
・デリゲートにメソッドを登録する際には、【+=】で登録するんだな〜(演算子のオーバーロード)
・返り値と引数の条件が同じなら複数のメソッドが登録できるんだな〜
次は、デリゲートを利用するメリットや
デリゲートに似ているイベント(event)や、アクション(Action)、ファンク(Func)について説明しようと思います。