- 追加された行はこの色です。
- 削除された行はこの色です。
&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]]によると次の通り。
--同じクラスの静的メソッドである場合等しい。
--同じオブジェクトのインスタンスメソッドである場合等しい。
--それ以外は異なる。
-[[c# - Remove duplicate delegate from event - Stack Overflow:http://stackoverflow.com/questions/3518603/remove-duplicate-delegate-from-event]]