Visual Basic でなんとなくイベントとデリゲート その9。 - イベントとデリゲートの絡み加減は? -
イベントとデリゲートについて
なんとなく(そしてしとやかに)
お勉強しています、根は真面目なとりこびとです。こんにちは。
今回で「その10」です。10ですか、私の年齢と同じですね。
前回は「イベントのしくみはデリゲートでできてるっぽいぞ!」ってところまでやりました。今回はそのイベントのしくみとやらをつらつら書きます。
まず、前回使用したコードをもう一度引っ張り出してきます。これです↓。イベントの宣言時にデリゲートを使用したほうでしたね。
Public Event DisplayNameChanged As System.EventHandler
EventHandler デリゲートを使用したイベントの宣言でしたね。まずはコイツがどうなっているのか調べましたところ、Event ステートメントの宣言に対し、以下のコードが追加されるようです。
Private DisplayNameChangedEvent As EventHandler
Public Sub add_DisplayNameChanged(ByVal d As EventHandler)
DisplayNameChangedEvent = CType([Delegate].Combine(DisplayNameChangedEvent, d), EventHandler)
End Sub
Public Sub remove_DisplayNameChanged(ByVal d As EventHandler)
DisplayNameChangedEvent = CType([Delegate].Remove(DisplayNameChangedEvent, d), EventHandler)
End Sub
どれどれ?ふむふむ・・・、EventHandler
型のプライベートな変数(名前は「イベント名 + Event」。)と、パブリック(というか、これはイベントのスコープと同じ?)なメソッドが2つ(名前はそれぞれ「add_
+ イベント名
」、「remove_ + イベント名」)ありますね。メソッドの中身を見ても特に変わったことはしていなくて、その7で出てきたDelegate.Combine メソッドとかを使ってるだけっぽいです。(Delegate.Remove は削除するです。)
同様に、これ↓。宣言時にデリゲートを使用せず、メソッドのように宣言したほうです。
Public Event DisplayNameChanged(ByVal sender As Object, ByVal e As EventArgs)
これはどうなっているのかというと、シグニチャが同じであっても、新たにデリゲートを宣言したことになります。こんな感じ↓
Public Delegate Sub DisplayNameChangedEventHandler(ByVal sender As Object, ByVal e As EventArgs)
Private DisplayNameChangedEvent As DisplayNameChangedEventHandler
Public Sub add_DisplayNameChanged(ByVal d As DisplayNameChangedEventHandler)
DisplayNameChangedEvent = CType([Delegate].Combine(DisplayNameChangedEvent, d), DisplayNameChangedEventHandler)
End Sub
Public Sub remove_DisplayNameChanged(ByVal d As EventHandler)
DisplayNameChangedEvent = CType([Delegate].Remove(DisplayNameChangedEvent, d), DisplayNameChangedEventHandler)
End Sub
こちらも見てみると、デリゲートが一つ(名前は「イベント名 + EventHandler」になる。) と、後は上のほうでやったのと同じようなメンバ(ただし、EventHandler
デリゲート型ではなく、DisplayNameChangedEventHandler デリゲート型により記述されたもの。)ができるみたいですね。
ふぅ~。イベントの中身を見てみると、少しずつイベントのしくみが見えてきました。デリゲート 型の変数、それに対するデリゲートの結合、または削除を行うメソッド。おもしろいですよね~って、これ・・・
最初のほうでやったアレっぽい気がしてきませんか?(・∀・)
というわけで次回に続きます~♪
※ 暗黙的に宣言される変数やメンバの名前と同じ名前のメンバを明示的に使用することはできないので注意してください~。