かるあ のメモ

アクセスカウンタ

help リーダーに追加 RSS VB9 ゆるいデリゲート

<<   作成日時 : 2008/01/20 11:45   >>

トラックバック 0 / コメント 0

緩いデリゲートってあんまり解説されていないよね。
まぁ C# は 2.0 からあったしそれほど意識しないからかな。


次のイベントハンドラはどちらも問題なく登録できます。
Protected WithEvents Button1 As New Button()
Protected Sub Button1_Click(ByVal sender As Object, ByVal args As EventArgs) Handles Button1.Click
    MessageBox.Show("Button1_Click")
End Sub
Protected Sub Click1() Handles Button1.Click
    MessageBox.Show("Click1")
End Sub
ちょっとReflectorで除いてみましょうか。
Dim handler As EventHandler = New EventHandler(AddressOf Me._Lambda$__1)
Dim handler2 As EventHandler = New EventHandler(AddressOf Me.Button1_Click)
If (Not Me._Button1 Is Nothing) Then
    RemoveHandler Me._Button1.Click, handler
    RemoveHandler Me._Button1.Click, handler2
End If
Me._Button1 = WithEventsValue
If (Not Me._Button1 Is Nothing) Then
    AddHandler Me._Button1.Click, handler
    AddHandler Me._Button1.Click, handler2
End If

Button1_Clickの登録はそのままですが、Click1の登録は実際のメソッドではなく _Lambda$__1 を登録しています。
_Lambda$__1 の定義はこんな感じです。
<DebuggerStepThrough, CompilerGenerated> _
Private Sub _Lambda$__1(ByVal a0 As Object, ByVal a1 As EventArgs)
    Me.Click1
End Sub
Button.Click のシグネチャと同じラッパーメソッドが自動生成され Click1() が呼ばれています。
たとえばこんな使い方ができます。動的にボタンを作ってイベントハンドラを定義しています。
Dim hogeButton = New Button() With {.Name = "hogeButton", .Text = "ほげ"}
AddHandler hogeButton.Click, Function(Byval sender As Object, Byval args As EventArgs) MessageBox.Show("hoge1")
AddHandler hogeButton.Click, Function() MessageBox.Show("hoge2")
Me.Controls.Add(hogeButton)

AddHander で Click イベントにラムダ式を割り当てています。
1つ目のラムダ式はボタンクリックのシグネチャと一致していますが、2つ目のラムダ式はシグネチャは一致していません。
しかしこの2つは正常にイベントとして登録され動作します。
デリゲートの推論が働いているため Sub(Object, EventArgs) に推論されるためです。

推論できないのでこんな登録はできません。
Click2 はともかく Click1 は解決してくれてもいいのにとも思う。
    ' コンパイルエラー
Protected Sub Click1(ByVal sender As Object) Handles Button1.Click
    MessageBox.Show("Click1")
End Sub

' コンパイルエラー
Protected Sub Click2(ByVal sender As Object, ByVal args As EventArgs, ByVal obj As Object) Handles Button1.Click
    MessageBox.Show("Click2")
End Sub

設定テーマ

注目テーマ 一覧

月別リンク

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
URL(任意)
本 文