C# 入門 & 実践 / C sharp

4-25. デリゲート と イベント - 1 - デリゲートって何ですか?


デリゲートの単語の意味は
delegate = 代理者 , 権限・任務などを委任[委嘱]する
だそうで

. C++ の関数ポインタと類似の目的で使用される
. デリゲートは静的メソッドとインスタンス メソッドの両方を表すことができる。
. デリゲートは、.NET Framework のイベント ハンドラとコールバック関数に使用されます。

イベントが発生して処理を実行する際に使用するメソッドをポインタとして渡すイメージですが
その「渡す」のにデリゲートを利用すると・・・
言葉で表現するのは難しいです><;
* 主語がはっきり表現出来ていないので実例で主語をはっきりさせればわかりやすいと思います。


1. デリゲートメソッド


早速 デリゲートメソッドを作ってみます。
これはまさに関数ポインタですね。

デリゲートを作成して、そのデリゲートを渡します。

    class BbDelegate
    {
        private int cnt = 0;

        public BbDelegate(int i)
        {
            cnt = i;
        }

        // delegate メソッド宣言
        public delegate int SetCnt(int i, int cnt);

        // SetCont を使用するメソッド
        public void UseFunc(SetCnt func)
        {
            cnt = func( 5, cnt );
            Console.WriteLine("cnt : {0}", cnt);
        }
    }

    class MyTester
    {
        // delegate 用 メソッド 1
        public static int Kakezan(int i, int cnt)
        {
            return i * cnt;
        }
        // delegate 用 メソッド 2
        public static int Tashizan(int i, int cnt)
        {
            return i + cnt;
        }

        static void Main()
        {
            BbDelegate b1 = new BbDelegate(10);

            // デリゲートを作成!
            // 掛け算バージョン
            BbDelegate.SetCnt kake = new BbDelegate.SetCnt(Kakezan);
            // 足し算バーション
            BbDelegate.SetCnt tashi = new BbDelegate.SetCnt(Tashizan);

            // デリゲートを渡す!掛け算を使ってみる。
            b1.UseFunc(kake);

            // デリゲートを渡す!足し算を使ってみる。
            b1.UseFunc(tashi);

        }
    }

cnt : 50
cnt : 55

この用に
kake を渡したときは、 5 * 10 が実行され
tashi を渡したときは、 5 + 50 が実行されました^-^。

掛け算メソッドを見てもらうと
public static int Kakezan(int i, int cnt)
まず static メソッド。
そして、返り値と引数は、
public delegate int SetCnt(int i,int cnt);
と同じ。
作成方法で重要なのはこの2点です。

あとは、デリゲートを生成して渡す!
なーんとなく基本的な使い方はわかりました。

さらに デリゲートは static メソッドではなく、インスタンス内のメソッドも利用することが出来ます!
C++ 関数ポインタとの大きな違いはここに有るようです。

2. インスタンスメソッド



内容はほぼ同じですが
デリゲートに使用するメソッドが
static
ではなく、インスタンスから利用しています!

    class BbDelegate
    {
        private int cnt = 0;

        public BbDelegate(int i)
        {
            cnt = i;
        }

        // delegate メソッド宣言
        public delegate int SetCnt(int i,int cnt);

        // SetCont を使用するメソッド
        public void UseFunc(SetCnt func)
        {
            cnt = func( 5, cnt );
            Console.WriteLine("cnt : {0}", cnt);
        }
    }

    class MyTester
    {
        // delegate 用 メソッド 1
        public int Kakezan(int i, int cnt)
        {
            return i * cnt;
        }
        // delegate 用 メソッド 2
        public int Tashizan(int i, int cnt)
        {
            return i + cnt;
        }

        static void Main()
        {
            BbDelegate b1 = new BbDelegate(10);

            MyTester mt = new MyTester();
            // デリゲートを作成!

            // 掛け算バージョン
            BbDelegate.SetCnt kake = new BbDelegate.SetCnt( mt.Kakezan );
            // 足し算バーション
            BbDelegate.SetCnt tashi = new BbDelegate.SetCnt( mt.Tashizan );

            // 掛け算を使ってみる。
            b1.UseFunc(kake);

            // 足し算を使ってみる。
            b1.UseFunc(tashi);

        }
    }




4-24. 例外処理 - 2 - 独自の例外オブジェクトを作る。 « 4. C# 入門 Level 2 » 4-26. デリゲート - 2 - static デリゲート / マルチキャストデリゲート


C# 入門 & 実践 / C sharp