一般的にイベントハンドラーというのはイベント発生を待ち受けるイベントループに対して実際の処理の部分のこと。
EventHandler型というのは定義済みのデリゲート型のこと。EventHandler型の1つめの引数はObject型で2つめの引数がEventArgs型となる。
呼び出しは自身のクラスからのみ可能で、直接デリゲート型を公開せずに外部から登録/解除できる仕組み。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public partial class Form1 : Form { // EventHandlerはデリゲート型 public event EventHandler TestEvent1; // 引数はobjectとEventArgsの2つだが、2つ目を指定することもできる public event EventHandler<string> TestEvent2; //これだとobjectとstringが引数となる public Form1() { InitializeComponent(); TestEvent2 = (s, e) => { MessageBox.Show(e); }; TestEvent2(this, "hello"); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
public partial class Form1 : Form { public Form1() { InitializeComponent(); new ReceiverClass(); } } public class TestEventArgs : EventArgs { public string Msg; } public class SenderClass // Sender(イベント発生側) { public event EventHandler<TestEventArgs> TestEvent; protected virtual void OnTestEvent(TestEventArgs e) // protected virtual void OnXXXは慣例 { TestEvent?.Invoke(this, e); // TestEventを呼べるのはSenderClassのみなのでOnXXXが必要 } public void Start() { var e = new TestEventArgs() { Msg = "Hello" }; OnTestEvent(e); } } public class ReceiverClass // Receiver(イベント受取側) { public ReceiverClass() { var s = new SenderClass(); s.TestEvent += SayHello; // Subscribe s.Start(); } private void SayHello (object s, TestEventArgs e) { MessageBox.Show(e.Msg); } } |