いつも参考にさせて頂いています。
イベントとデリゲートについて勉強しているのですが、
ある海外サイトに以下の様なコードを見つけたのですが、その中の
Dim del As SampleEventHandler = Me.SampleEventEvent
の構文で何故存在しないメンバを登録することができるのでしょうか?
どなたかわかる方いましたらご教授お願いします。
以下ソースコード---------------------------
Option Explicit On
Public Class Form1
Inherits System.Windows.Forms.Form
Class A
Public Delegate Sub SampleEventHandler(ByVal value As String)
Public Event SampleEvent As SampleEventHandler
Public Sub RaiseSampleEvent()
Dim del As SampleEventHandler = Me.SampleEventEvent
del.Invoke("Raise Event")
End Sub
End Class
Private WithEvents myA As New A
#Region " Windows フォーム デザイナで生成されたコード "
#End Region
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
myA.RaiseSampleEvent()
End Sub
Private Sub myA_SampleEvent(ByVal value As String) Handles myA.SampleEvent
MsgBox(value)
End Sub
End Class
# 回答がつかないようなので。
> の構文で何故存在しないメンバを登録することができるのでしょうか?
理由については……とりあえず、「そういう仕様だから」と答えておきます。(^_^;)
先の例でいえば、もしもイベント宣言が
Public Event テスト As SampleEventHandler
であれば、
Dim del As SampleEventHandler = Me.テストEvent
となりますね。
ただ、そのメンバが存在しない訳では無いですよ。
作成した exe を ildasm.exe で表示してみると、クラス A の内部に、
「SampleEventEvent」というプライベートフィールドが見えると思います。
ildasm を使うのが面倒なら、Class Aの内部に、
Private SampleEventEvent As Integer
という一行を追加してみてください。Visual Studioが、以下のエラーを報告するはずです。
》class 'A' の 'Public Event SampleEvent(value As String)' に対して暗黙的に宣言された
》'Private Dim SampleEventEvent As SampleEventHandler' と競合しています。
実際のところ、VB.NETにおいては、
SampleEventEvent.Invoke("イベント発生")
RaiseEvent SampleEvent("イベント発生")
この2つは、(ほぼ)同じコードを意味しています。
ご教授ありがとうございます。
> Dim del As SampleEventHandler = Me.テストEvent
のようにイベント名の後ろに「Event」を付ける構文があるということですね。
ヘルプ等を見ても見つけられなくて困り果てていました。
また何かありましたらお願いします。