delegateを調べて試してみた
<はじめに>
delegateと聞くと、「イベントとメソッドを紐づけるときに使う何か」という程度の認識だったのですが、このままではいかん!と思って調べてみたらなかなか面白いではありませんか。
そこで、delegate型で少し遊んでみたのが下記
①delegate型のインスタンスを引数にして試してみた
②ジェネリックなdelegate型を試してみた
③匿名メソッドでdelegate型を試してみた
<プログラム>
class Program { static void Main(string[] args) { //----------------------------------------- // 変数の定義 // int[] x = { 1, 3, 5, 7, 11 }; string name = "nomurabbit"; //----------------------------------------- // delegate型のインスタンス // Hoge hogeGetDouble = new Hoge(GetDouble); Console.WriteLine("//// delegate型のインスタンス----"); TestMethod(hogeGetDouble, x); //----------------------------------------- // ジェネリックなdelegate // Fuga<string> fugaGetMessage = new Fuga<string>(GetMessage); Console.WriteLine("//// ジェネリックなdelegate------"); fugaGetMessage(name); //----------------------------------------- // 匿名メソッドでdelegate // Console.WriteLine("//// 匿名メソッドでdelegate------"); TestMethod(delegate(int y) { return y * 4; }, x); } #region delegateの定義 delegate int Hoge(int x); delegate void Fuga<T> (T x); #endregion #region delegateに渡すメソッド static int GetDouble(int x) { return x * 2; } static void GetMessage(string tempMessage) { Console.WriteLine("My name is " + tempMessage); } #endregion #region delegate型のインスタンスに第二引数を渡すメソッド static void TestMethod (Hoge h, int[] x) { foreach (var item in x) { Console.WriteLine(h(item).ToString()); } } #endregion }
<実行結果>
<まとめ>
なんと言ってもメソッドをインスタンスにして引数扱いできちゃうのが素敵だと思います。関数型っぽい(?)ですよね。
あとは、匿名メソッドが便利!メソッド名決めるのってなんだかんだ悩みますし、
delegate型に渡すちょっとしたメソッドが匿名で書けるのは気持ちいい!