とりこらぼ。

Learn from yesterday,
live for today,
hope for tomorrow.

目次

Blog 利用状況

ニュース

プロフィール

  • 名前:とりこびと
    とるに足らない人間です。

  • Wankuma MVP
    for '平々凡々'

Web Site

  • Memo(Of T)

もうひとつの Blog

広告っぽい

書庫

日記カテゴリ

Visual Basic でなんとなくイベントとデリゲート その11。 - イベントの発生はこんな感じ -

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 ObjectByVal e As EventArgs)

#Region "DisplayNameChanged イベントの宣言により暗黙的に生成されるコード。"

    Public Delegate Sub DisplayNameChangedEventHandler(ByVal sender As ObjectByVal 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 ステートメントはイベントの宣言によって暗黙的に宣言されたデリゲート型のメンバ変数に誰かによって詰め込まれたデリゲートを呼び出すしくみ、というわけですね。



前回と今回で、イベントの宣言と発生についてお勉強して、イベントはデリゲートの宣言と呼び出しに置き換わっている感じが、なんとなく分かってきました。

とはいうものの、まだ誰もデリゲートを詰め込んだりしていませんよねぇ。というわけで、前回の最後にフった、


最初のほうでやったアレ


を次回に勉強していきたいと思います。






# べ、べつに前回フりをミスったわけじゃないんだからねっ!!!


投稿日時 : 2007年11月9日 14:22

Feedback

# re: Visual Basic でなんとなくイベントとデリゲート その11。 - イベントの発生はこんな感じ - 2007/11/09 14:53 渋木宏明(ひどり)

Private DisplayNameChangedEvent As DisplayNameChangedEventHandler

を、C# で言うと

private List<DisplayNameChangedEventHandler> DisplayNameChangedEvent;

とした方が正確さがアップするのではないかと。

# re: Visual Basic でなんとなくイベントとデリゲート その11。 - イベントの発生はこんな感じ - 2007/11/09 18:01 とりこびと

渋木宏明(ひどり) さん、コメントありがとうございます。

>List<DisplayNameChangedEventHandler>

あれ?そうなんですか!?

Visual Basic の言語仕様(VBLS80.Doc)を読んでみたんですけど、本文にあるようなコードが書かれていたんですよ。

もしかして英語を読み間違えました?orz

# re: Visual Basic でなんとなくイベントとデリゲート その11。 - イベントの発生はこんな感じ - 2007/11/10 4:15 渋木宏明(ひどり)

>もしかして英語を読み間違えました?orz

コンパイルかけて怒られる、って辺りから見て、「所詮は疑似コード」てやつじゃないですかねぇ。

.NET のイベントは結構単純だし、コンパイルが通る形で、全部自分で書けるはずですよ。

# re: Visual Basic でなんとなくイベントとデリゲート その11。 - イベントの発生はこんな感じ - 2007/11/12 9:10 とりこびと

渋木宏明(ひどり) さん、コメントありがとうございます。

>コンパイルかけて怒られる

あ・・・ごめんなさい。
これはEvent ステートメントと同時にあのコードは書けないという意味です。(Event ステートメントで暗黙的に宣言された変数名とかぶるため。)Event ステートメントがない状態では怒られませんです。

>所詮は疑似コード

なるほど。そうかもしれません。
実際にはどうなるかちょっと調べてきます。

・・・C#では内部でListを持ってるってことですよね?

# re: Visual Basic でなんとなくイベントとデリゲート その11。 - イベントの発生はこんな感じ - 2007/11/12 10:05 とりこびと

暗黙的に宣言されているものを引っ張り出すと以下のようになりますた。

http://f.hatena.ne.jp/images/fotolife/t/torikobito/20071112/20071112100123.png

型 'System.EventHandler' の値を 'System.Collections.Generic.List(Of System.EventHandler)' に変換できません。

# Visual Basic でなんとなくイベントとデリゲート その12。 - AddHandler と RemoveHandler はこんな感じ - 2007/11/12 14:20 とりこらぼ。

Visual Basic でなんとなくイベントとデリゲート その12。 - AddHandler と RemoveHandler はこんな感じ -

タイトル
名前
Url
コメント