ページ

2010-03-03

C#勉強中 改定版C#入門 17

  • 第17章 言語に内蔵されたイベント機能
    おもいっきり特殊機能に入ってきました。小さなサンプルで説明しようとしていることで却ってイベント機能を判りにくくしているように思えます(とはいえ大きなサンプルはそれ自体難解になってしまいますが)。この章の最後のページ「ウィンドウにおけるイベントの使われ方」が一番簡単に読めました。
    イベント機能を多用するウィンドウシステムのレベルまで落としてみると判り易くなりそうです。ウィンドウシステムでコントロールが外部にある事象の発生を通知する場合には、そのコントロール固有のウィンドウメッセージを送出し、メッセージ処理ルーチンがそのメッセージに対応した処理を行なうようになっています。この場合メッセージを送出する側(パブリッシャ)と受け取る側(サブスクライバ)とは、メッセージの意味とパラメタについて合意が取れている必要があります。しかし、単純なメッセージシステムではこのような合意を強制することができません(このため障害が出やすくなります)。
    C#のイベント機能はこのようなメッセージの送信側と受信側での合意を強制する(コンパイル時、実行に保証する)機能と考えることができると思います。メッセージの送出(イベント発行)はイベントが定義されたクラス(継承を含む)からのみ可能になっています。従って関係の無いオブジェクトがイベントを発行することはありません。メッセージ自体は、イベント機能の中に隠蔽されていて、外部からは見ることができません。ただ、発生するイベントのハンドラは、任意のクラスにおいて定義でき、抽象化されたイベントに登録(ここでdelegateを使用)できるようになっています。たいていのプログラミングではイベントのパブリッシャはシステム提供され、アプリケーション側ではそれに対するハンドラを作成、登録するだけで済みます。
    アプリケーションサイドで知る必要があるものは、抽象化されたイベント(eventキーワードで指示)と、そのイベントに対するハンドラを定義するためのdelegate(に適合するメソッドの型)だけになります。ただこの章では、イベントのパブリッシャも想定しているようで、前半のテキストにはパブリッシャ、サブスクライバの両方が説明されているため、判りにくくなっているかと思います。通常のプログラマ相手であれば、サブスクライバ側だけで充分で、またサブスクライバ側だけだと極端に簡単になります。
今日は、イベント機能の理解だけでおもいきり時間がかかってしまいました。

0 件のコメント:

コメントを投稿