C#のイベントを理解したい。（WindowsFormアプリ）

WindowsFormアプリをよく仕事で作成するのですが、
イベントを生成して、そのイベントをキャッチすることの
理解がいつも曖昧だったので、ここでアウトプットしてしっかり
理解しておこうと思います。

本記事は下記の投稿でかなりイベントについて理解することができました。

https://qiita.com/TsuyoshiUshio@github/items/8b4168260ef70ec60708

# コード
イベント理解用に今回参考にさせて頂いた投稿のコードを私なりに解釈して、
下記のようにしてみました。

```C#
using System;
using System.Windows.Forms;

namespace EventTest
{
    public partial class Main_From : Form
    {

        public Main_From()
        {
            InitializeComponent();
        }

        private void event1_Click(object sender, EventArgs e)
        {
            //インスタンスの生成
            var Event_main = new Event_main();
            var Event_sub = new Event_sub();

            Event_sub.SubEvent(Event_main); //イベント発生前にクラス登録
            Event_main.Execution();
        }
    }

    public class Event_main{

        public event ButtonHandler ButtonEvent;
        public EventArgs e = null;
        public delegate void ButtonHandler(Event_main l, EventArgs e);

        public void Execution()
        {
            if (ButtonEvent != null)
            {
                ButtonEvent(this, e); //イベント発生
            }
        }
    }

    public class Event_sub
    {
        public void SubEvent(Event_main ButtonEvent)
        {
            ButtonEvent.ButtonEvent += new Event_main.ButtonHandler(EventExecution);
        }

        private void EventExecution(Event_main ButtonEvent, EventArgs e)
        {
            Console.WriteLine("Buttonが押されたことによるイベント");
        }
    }
}
```

# Class Event_mainについて
```C#
    public class Event_main{

        public event ButtonHandler ButtonEvent; //イベントの宣言
        public EventArgs e = null;              //イベントデータを格納するクラス
        public delegate void ButtonHandler(Event_main l, EventArgs e);

        //実際に走るところ
        public void Execution()
        {
            //イベントのnullチェック
            if (ButtonEvent != null)
            {
                ButtonEvent(this, e); //実際にイベントが発生
            }
        }
    }
```

ここでとりあえず、イベントの宣言、実際に実行する時に走ったときに
イベントが発生されるように準備。
※delegateがいまいちわからん。。。今度また理解を深めます。


# Class Event_subについて
```C#
    public class Event_sub
    {
        //Event_Mian側のイベントを登録
        public void SubEvent(Event_main ButtonEvent)
        {
            ButtonEvent.ButtonEvent += new Event_main.ButtonHandler(EventExecution);
        }

        //実際にEventMain側でイベントが発生したとき、ここが実行される
        private void EventExecution(Event_main ButtonEvent, EventArgs e)
        {
            Console.WriteLine("Buttonが押されたことによるイベント");
        }
    }
}
```
イベント発生した際の、動作をここで記すことと、Main側のイベントを登録する。

# 実行クラスについて

```C#
        private void event1_Click(object sender, EventArgs e)
        {
            //インスタンスの生成
            var Event_main = new Event_main();
            var Event_sub = new Event_sub();

            Event_sub.SubEvent(Event_main); //イベント発生前にクラス登録
            Event_main.Execution();
        }
```
今回はWindowsForm側にボタンを配置して、そのボタンをクリックすると、
Event_mainのExecutionを実行するようにコーディング。
Executionの中でイベントを発生させているような感じです。

実際にWindowsFormでボタンを押すと、下記のようにClass Event_sub側で実行している
```C#
Console.WriteLine("Buttonが押されたことによるイベント");
```
が実行されていることが確認できました。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2009123/83e4b285-7bf0-ab21-432c-16054bbc7e5f.png)

# 最後に
今回は上記コードでイベントを発生させて確認してみました。
すべてをまだ理解しているわけではないので不明点がなくなるように
していこうと思います。
この記事も誰かのためC#のイベントについての知識につながれば幸いです。