トルネード

毛利のメモ書き

C# イベント作成

イベントとは

クラス内で、何らかの処理が完了したあとなどに外部クラスのメソッドを実行したい場合イベントを使います。具体的には、System.Windows.Forms.ButtonClickイベントなどです。メインクラスに配置された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イベントMainClassRespメソッドを紐付けます。これにより、EventTestクラス'からMainClassRespメソッド`を実行できます。

MainClassRespメソッドをイベントから実行する。

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()");
    }
}

f:id:mojeld:20191027121854g:plain

https://amzn.to/2Pm0j9N

https://amzn.to/2n0fzx4