nomurabbitのブログ

nomurabbitのブログはITを中心にした技術ブログです。

nomurabbitのブログ

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
}


<実行結果>
f:id:nomurabbit:20131016235259p:plain


<まとめ>
なんと言ってもメソッドをインスタンスにして引数扱いできちゃうのが素敵だと思います。関数型っぽい(?)ですよね。

あとは、匿名メソッドが便利!メソッド名決めるのってなんだかんだ悩みますし、
delegate型に渡すちょっとしたメソッドが匿名で書けるのは気持ちいい!