&tag(CSharp/デリゲート);
*目次 [#cb610ac3]
#contents
*参考情報 [#v4d48cbe]
-[[../イベント]]
-[[デリゲート (C# によるプログラミング入門):http://ufcpp.net/study/csharp/sp_delegate.html]]
*デリゲートとは [#h8a316c4]
-関数ポインタのようなもの。
-ただしデリゲート変数には複数のメソッドを登録できる(マルチキャストデリゲートと呼ばれる)。
*簡単なデリゲート [#fb6b9f99]
**delegateの宣言 [#e95fd78f]
- delegate 戻り値の型 名前(引数)のように宣言する
#pre{{
delegate int SimpleDelegete(string message)
}}

**delegateの生成と呼び出し [#p89cc8ca]
- 一番簡単なdelegateのインスタンスを生成して直接メソッドを呼び出す例。
#pre{{
        delegate void SpeakDelegate(string message);

        private void Speak(string message)
        {
            Debug.WriteLine(message);
        }

        private void StarSpeak(string message)
        {
            Debug.WriteLine("★" + message);
        }

        private void simple_Clicked(object sender, RoutedEventArgs e)
        {
            //古式ゆかしい書き方
            SpeakDelegate s = new SpeakDelegate(Speak);
            s("Hello World");

            //C#2.0からはメソッドからdelegateへ暗黙の変換がなされる。
            SpeakDelegate s2 = Speak;
            s2("Hello World2");

            //マルチキャストデリゲートと呼ばれる(SpeakとStartSpeakが順番に呼ばれる)
            SpeakDelegate s3 = Speak;
            s3 += StarSpeak;
            s3("Hello World3");       
        }
}}
- 出力結果
#pre{{
Hello World
Hello World2
Hello World3
★Hello World3
}}

*Tips [#xdca0895]
**SpeakDelegate s = new SpeakDelegate(Speak)とSpeakDelegate s2 = Speakの違いは? [#u2c996d7]
-[[デリゲート (C# によるプログラミング入門):http://ufcpp.net/study/csharp/sp_delegate.html#instancemethod]]やMSDNによるとC#2.0から導入されたメソッドとdelegateの暗黙の変換機能を使っているかどうかの違いらしい。
-わざわざnewする必要はなさそうだがコードを読むためには両方覚えておいた方がよさそう。

**Delegateの比較 [#nc565f7f]
-イベントなどにdelegateを追加・削除する場合、何をもって等しいとみなされるかが問題になる。
-[[Delegate.Equality 演算子 (System):http://msdn.microsoft.com/ja-jp/library/system.delegate.op_equality.aspx]]によると次のt通り。
-[[Delegate.Equality 演算子 (System):http://msdn.microsoft.com/ja-jp/library/system.delegate.op_equality.aspx]]によると次の通り。
--同じクラスの静的メソッドである場合等しい。
--同じオブジェクトのインスタンスメソッドである場合等しい。
--それ以外は異なる。
--[[c# - Remove duplicate delegate from event - Stack Overflow:http://stackoverflow.com/questions/3518603/remove-duplicate-delegate-from-event]]
-[[c# - Remove duplicate delegate from event - Stack Overflow:http://stackoverflow.com/questions/3518603/remove-duplicate-delegate-from-event]]

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS