Tag: CSharp イベント

目次

参考情報

簡単な例(独自引数のdelegate=非推奨)

  • ../デリゲートのサンプルをevent書き換えるとつぎのようになる。
            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");
            }
    
  • 実行結果
    Hello World
    ★Hello World
    

簡単な例その2(作法に従う)

  • delegateの作法を.Net推奨の「delegate void EventHandler(object sender, EventArgs e)」風にすると次のようになる。
            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" });
            }
    
  • 実行結果
    Hello World
    ★Hello World
    
    

簡単な例その3(作法に従う&EventHandlerを直接使う)

  • 「delegate void EventHandler(Object senderm EventArgs e)」という定義済みのdelegate型を使うこともできる。
  • データの受け渡しが必要ない場合これでOK。
            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());
            }
    
  • 実行結果
    固定メッセージ
    ★固定メッセージ
    

簡単な例その4(EventHandler+Generics)

Tips

デリゲートとイベントの使い分け

  • C#のデリゲートとイベントの使い分けが参考になる。
  • デリゲートもイベントもメソッドを登録して呼び出すという点では同じ。
  • イベントハンドラーのシグニチャが、void EventHandler(object sender, EventArgs e)になるというのは慣用であって本質ではない。
  • イベントは暗黙のデリゲートを生成し、 それが外部からいじられないということが重要。
  • 普段はイベントを使うようにしておけば問題なさそう。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-04-13 (水) 16:48:09