- 追加された行はこの色です。
- 削除された行はこの色です。
&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{{
固定メッセージ
★固定メッセージ
}}
*Tips [#f6888de2]
**デリゲートとイベントの使い分け [#s79bdc4f]
-[[C#のデリゲートとイベントの使い分け:http://tec.jpn.ph/comp/delegateandevent.html]]が参考になる。
-デリゲートもイベントもメソッドを登録して呼び出すという点では同じ。
-イベントハンドラーのシグニチャが、void EventHandler(object sender, EventArgs e)になるというのは慣用であって本質ではない。
-イベントは暗黙のデリゲートを生成し、 それが外部からいじられないということが重要。
-普段はイベントを使うようにしておけば問題なさそう。