デリゲートに登録する方法

解決


AREX  2005-01-20 19:26:37  No: 87949  IP: [192.*.*.*]

いつも参考にさせて頂いています。
イベントとデリゲートについて勉強しているのですが、
ある海外サイトに以下の様なコードを見つけたのですが、その中の
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

編集 削除
魔界の仮面弁士  2005-01-22 20:03:55  No: 87950  IP: [192.*.*.*]

# 回答がつかないようなので。

> の構文で何故存在しないメンバを登録することができるのでしょうか?

理由については……とりあえず、「そういう仕様だから」と答えておきます。(^_^;)
先の例でいえば、もしもイベント宣言が
  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つは、(ほぼ)同じコードを意味しています。

編集 削除
AREX  2005-01-24 13:09:49  No: 87951  IP: [192.*.*.*]

ご教授ありがとうございます。
> Dim del As SampleEventHandler = Me.テストEvent
のようにイベント名の後ろに「Event」を付ける構文があるということですね。
ヘルプ等を見ても見つけられなくて困り果てていました。

また何かありましたらお願いします。

編集 削除