&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]]