&tag(CSharp, イベント); *目次 [#x1d18dd2] #contents *参考情報 [#f1313f79] -[[イベント (C# によるプログラミング入門):http://ufcpp.net/study/csharp/sp_event.html]] -[[How to: Implement Interface Events (C#):http://msdn.microsoft.com/en-us/library/ak9w5846(v=vs.80).aspx]] -[[VB6開発者向け:C#で始める.NETプログラミング:第7回 オブジェクト指向プログラミング(2)|gihyo.jp … 技術評論社:http://gihyo.jp/dev/serial/01/vb62csharp/0007]] -[[C#のデリゲートとイベントの使い分け:http://tec.jpn.ph/comp/delegateandevent.html]] *簡単な例(独自引数のdelegate=非推奨) [#z2ec066b] -[[../デリゲート]]のサンプルをevent書き換えるとつぎのようになる。 #pre{{ delegate void SpeakDelegate(string message); private void Speak(string message) { Debug.WriteLine(message); } private void StarSpeak(string message) { Debug.WriteLine("★" + message); } event SpeakDelegate SpeakEventHandler; private void event_Clicked(object sender, RoutedEventArgs e) { SpeakEventHandler += Speak; SpeakEventHandler += StarSpeak; SpeakEventHandler("Hello World"); } }} -実行結果 #pre{{ Hello World ★Hello World }} *簡単な例その2(作法に従う) [#y7eff865] -delegateの作法を.Net推奨の「delegate void EventHandler(object sender, EventArgs e)」風にすると次のようになる。 #pre{{ public class SpeakEventArgs :EventArgs { public string Message {get; set; } } public void OnSpeak(object sender, SpeakEventArgs e) { Debug.WriteLine(e.Message); } public void OnStarSpeak(object sender, SpeakEventArgs e) { Debug.WriteLine("★" + e.Message); } delegate void SpeakHandler(object sender, SpeakEventArgs e); event SpeakHandler TestSpeakHandler; private void event2_Clicked(object sender, RoutedEventArgs e) { TestSpeakHandler += OnSpeak; TestSpeakHandler += OnStarSpeak; TestSpeakHandler(this, new SpeakEventArgs() { Message = "Hello World" }); } }} -実行結果 #pre{{ Hello World ★Hello World }} *簡単な例その3(作法に従う&EventHandlerを直接使う) [#y520b9ff] -「delegate void EventHandler(Object senderm EventArgs e)」という定義済みのdelegate型を使うこともできる。 -データの受け渡しが必要ない場合これでOK。 #pre{{ event EventHandler FixSpeakHandler; public void OnFixSpeak(object sender, EventArgs e) { Debug.WriteLine("固定メッセージ"); } public void OnFixStarSpeak(object sender, EventArgs e) { Debug.WriteLine("★固定メッセージ"); } private void event3_Clicked(object sender, RoutedEventArgs e) { FixSpeakHandler += OnFixSpeak; FixSpeakHandler += OnFixStarSpeak; FixSpeakHandler(this, new EventArgs()); } }} -実行結果 #pre{{ 固定メッセージ ★固定メッセージ }} *簡単な例その4(EventHandler+Generics) [#y185b8d3] -[[EventHandler ジェネリック デリゲート (System):http://msdn.microsoft.com/ja-jp/library/db0etb8x(v=vs.80).aspx]]にあるようにジェネリックスを使って引数の型を指定することができる)。 *Tips [#f6888de2] **デリゲートとイベントの使い分け [#s79bdc4f] -[[C#のデリゲートとイベントの使い分け:http://tec.jpn.ph/comp/delegateandevent.html]]が参考になる。 -デリゲートもイベントもメソッドを登録して呼び出すという点では同じ。 -イベントハンドラーのシグニチャが、void EventHandler(object sender, EventArgs e)になるというのは慣用であって本質ではない。 -イベントは暗黙のデリゲートを生成し、 それが外部からいじられないということが重要。 -普段はイベントを使うようにしておけば問題なさそう。