Visual Basic でなんとなくイベントとデリゲート その10。 - イベントの宣言はこんな感じ -
イベントとデリゲートについて、
なんとなく(そして軽やかに)
お勉強しています、実は方向音痴のとりこびとです。こんにちは♪
前回はイベントの宣言ってどうなっているの?ということでしたが、今回はイベントの発生についてです。
まず、現状の WankumaMember はどうなっているかを確認します。イベントの宣言をデリゲートに分解したりしたので以下のようになっています。(Region で括った部分がDisplayNameChanged イベントの宣言により暗黙的に生成されるコードです。実際に書くと怒られますから注意w)
Option Compare Binary
Option Explicit On
Option Strict On
Imports System
Public Class WankumaMember
Public Event DisplayNameChanged(ByVal sender As Object, ByVal e As EventArgs)
#Region "DisplayNameChanged イベントの宣言により暗黙的に生成されるコード。"
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
#End Region
Private _displayName As String
Public Property DisplayName() As String
Get
Return Me._displayName
End Get
Set(ByVal value As String)
Me._displayName = value
Me.OnDisplayNameChanged(New EventArgs)
End Set
End Property
Protected Sub OnDisplayNameChanged(ByVal e As EventArgs)
RaiseEvent DisplayNameChanged(Me, e)
End Sub
End Class
そうそう、こんなんなってました。Event ステートメントの宣言1行でこんなにいっぱいなってるんですよね。
さてさてぇ~、今回はイベントの発生についてですので、注目するのはここです↓ここ!
RaiseEvent DisplayNameChanged(Me, e)
RaiseEvent ステートメントですね。さっそくどうなるか調べてきました。RaiseEvent ステートメントは以下のようなコードと同じ動きをするようです。
Dim templateDelegate As DisplayNameChangedEventHandler
templateDelegate = DisplayNameChangedEvent
If Not templateDelegate Is Nothing Then
templateDelegate.Invoke(Me, e)
End If
今回は単純♪前回出てきた DisplayNameChangedEventHandler 型のメンバ変数 DisplayNameChangedEvent を、DisplayNameChangedEventHandler 型のローカル変数 templateDelegate に代入し、Invoke メソッドを呼び出しています。(Nothing のチェックもココで入ってますね。)
つまり、RaiseEvent ステートメントはイベントの宣言によって暗黙的に宣言されたデリゲート型のメンバ変数に誰かによって詰め込まれたデリゲートを呼び出すしくみ、というわけですね。
前回と今回で、イベントの宣言と発生についてお勉強して、イベントはデリゲートの宣言と呼び出しに置き換わっている感じが、なんとなく分かってきました。
とはいうものの、まだ誰もデリゲートを詰め込んだりしていませんよねぇ。というわけで、前回の最後にフった、
最初のほうでやったアレ
を次回に勉強していきたいと思います。
# べ、べつに前回フりをミスったわけじゃないんだからねっ!!!