[C#]イベントハンドラとはなんぞや

イベントハンドラとはなんぞや。

イベントハンドラは、デリゲートです。
(デリゲートよく分からねーって人はコチラ。)

百聞は一見に如かず。

まずは、Windowsフォームアプリケーションを作成して、Formにボタンをひとつ配置して、ボタンをダブルクリックするなりしてイベントハンドラを自動生成し、MessageBoxを置く。
ボタンを押せば、Hellowとメッセージボックスが開く。

ところで、このbutton1_Clickメソッドはなぜ、動くのか。

このメソッドを参照すると、下記のようにコードが自動生成されている。

this.button1.Clickとやらに EventHandlerのインスタンスを渡している。
つまり、button1.ClickもEventHandler型を受け取れるものだということ。

んで、このEventHandlerはなんぞってことでさらに追いかけると、

namespace System の上記までやってきた。

読み解くと、EventHandlerは、void型で、引数にobject型とEventArgs型をもつ、delegateとある。

つまり、ボタンはClickというデリゲート型の変数を持ち、その変数はEventHandlerというデリゲート型である。

以前の記事で、デリゲートとは、関数を覚えられる変数のようなものであると書いた。

ためしに、同じvoid型で、引数にobject型とEventArgs型をもつ関数を作ってみる。

そして、これをボタンのClickに代入する。

実行すると、HellowのあとにWorldとメッセージボックスが表示される。(+=で追加代入したから)

ちなみに、1の書き方と2の書き方がある。2は自動生成されるときに書かれている省略しない書き方。
自前で書くときは1で書く人が多いイメージ。

 

また、このClickという関数の定義を見ると、

とある。

なぜ、クリックするとこのClickが実行されるかは、イベントドリブン方式といって・・・、まぁ、そいうものだと理解する。

まとめると、
ボタンがクリックされると、イベントハンドラという名前のデリゲートが実行される。
デリゲートは関数を覚えられる変数だから、あらかじめ代入されていた関数が実行される。
ただ、それだけの話。

これで、イベントハンドラが何かざっくりと分かったんではないだろうか。

そして、このイベントハンドラをラムダ式でシンプルに書きたい場合は、前に書いた下記の記事が参考になると思う。
イベントハンドラとラムダ式

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">