イベントとは
クラス内で、何らかの処理が完了したあとなどに外部クラスのメソッドを実行したい場合イベントを使います。具体的には、System.Windows.Forms.ButtonでClickイベントなどです。メインクラスに配置されたClickイベントは、メインクラス側でButton1_Click()
などと紐付けることで、イベント発生時に紐付けたメソッドを呼び出すことができます。それによって、メインクラス側はボタンはクリックされたことがわかります。
自作クラス内にイベントを追加
下記のようなMainClass
というクラスを作ります。そこには、Resp
というメソッドを作成している。Resp
メソッドには、Console.WriteLine
を書いています。
class MainClass { private void Resp(object sender, string s1) { Console.WriteLine(s1); } }
ここに書かれたResp
をコールする別のクラス(EventTest
)を作成します。
class EventTest:IDisposable { public event EventHandler<string> OnEvent1; public void Method1(Exception _e, string _mes) { OnEvent1?.Invoke(_e, _mes); } public void Dispose() { OnEvent1?.Invoke(null, "Dispose()"); } }
EventTestクラス
に public event EventHandler<string>を作っています。これがイベントです。このEventTestクラス
を先程作ったMainClassに配置するとMainClassは下記のようなコードになります。
class MainClass { public MainClass() { using (var e1 = new EventTest()){} } private void Resp(object sender, string s1) { Console.WriteLine(s1); } }
ローカル変数ですが、MainClass
のコンストラクタ内にe1 = new EventTest()
インスタンスが作成できました。
しかし、これだけではEventTestクラス
内のeventでは、紐付けしていないので、Resp
メソッドをコールできません。
MainClass
クラスにイベントを紐付けます。
var e1 = new EventTest(); e1.OnEvent1 += new EventHandler<string>(Resp);
上記のようにEventTest
クラス内に作成したOnEvent1
イベントとMainClass
のRespメソッド
を紐付けます。これにより、EventTestクラス'から
MainClassの
Respメソッド`を実行できます。
MainClass
のRespメソッド
をイベントから実行する。
EventTest
内のOnEvent1
を実行することで、メインクラスのRespメソッド
が実行できます。
OnEvent1?.Invoke(null, "文字列");
上記のようなコードをEventTest
内で実行すれば、メインクラスのRespメソッド
がコールされます。
EventTest
は、IDisposable
を継承しているので、最後にDispose()が実行されます。そこに下記のコードを入れています。
public void Dispose() { OnEvent1?.Invoke(null, "Dispose()"); }
コード全体
class Program { static void Main(string[] args) { new MainClass(); //① メインクラス作成 } } class MainClass { public MainClass() { using (var e1 = new EventTest()) { // ②Eventの登録 e1.OnEvent1 += new EventHandler<string>(Resp); // ③Method1実行 e1.Method1(null,"Method実行"); } //⑤ Console.WriteLine("Constructor End."); } private void Resp(object sender, string s1) { //③④で実行 Console.WriteLine(s1); } } class EventTest:IDisposable { public event EventHandler<string> OnEvent1; public void Method1(Exception _e, string _mes) { OnEvent1?.Invoke(_e, _mes); } public void Dispose() { //④Dispose()実行 OnEvent1?.Invoke(null, "Dispose()"); } }