とりこらぼ。

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

目次

Blog 利用状況

ニュース

プロフィール

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

  • Wankuma MVP
    for '平々凡々'

Web Site

  • Memo(Of T)

もうひとつの Blog

広告っぽい

書庫

日記カテゴリ

Visual Basic でなんとなくイベントとデリゲート その7。 - デリゲートでもうちょっとだけ遊ぶ -

Visual Basic でなんとなくイベントとデリゲート その6。 - デリゲートでちょっとだけ遊ぶ -


なんとなく


お勉強しますね。いつもどおりですよ♪と、いうわけで、今回もいろいろ遊んでみますね。前回同様、こんな↓クラスを用意しておいて

Option Compare Binary
Option Explicit On
Option Strict On

Imports System

Public Class Messenger

    ' メッセージのフレーズ
    Private phrase As String = String.Empty

    ' メッセージのフレーズを設定するメソッド。
    Public Sub SetPhrase(ByVal phrase As String)

        Me.phrase = phrase

    End Sub

    ' メッセージを標準出力に表示する。
    Public Sub ShowMessage(ByVal targetName As String)

        Console.WriteLine(phrase, targetName)

    End Sub

End Class

showBufferinMessage と showJoJoMessage をがっちゃんこしてみる。がっちゃんこするにはDelegate.Combine メソッド を使用します。

Option Compare Binary
Option Explicit On
Option Strict On

Imports System

Public Delegate Sub ShowMessageDelegate(ByVal targetName As String)

Public Class Program

    Public Shared Sub Main()

        Dim bufferinMessenger As New Messenger

        bufferinMessenger.SetPhrase("{0} の半分はやさしさで出来ています。")

        Dim showBufferinMessage As ShowMessageDelegate
        showBufferinMessage = AddressOf bufferinMessenger.ShowMessage

        Dim jojoMessenger As New Messenger

        jojoMessenger.SetPhrase("さすが{0}! おれたちにできない事を平然とやってのけるッ そこにシビれる! あこがれるゥ!")

        Dim showJoJoMessage As ShowMessageDelegate
        showJoJoMessage = AddressOf jojoMessenger.ShowMessage

        Dim combinedDelegate As [Delegate] = [Delegate].Combine(showBufferinMessage, showJoJoMessage)

        combinedDelegate.DynamicInvoke("επιστημηさん")

    End Sub

End Class

出力結果は

επιστημηさん の半分はやさしさで出来ています。
さすがεπιστημηさん! おれたちにできない事を平然とやってのけるッ そこにシビれる! あこがれるゥ!

Delegate はがっちゃんこできますよ~と。

Delegate.DynamicInvoke メソッドは、MSDNによると

現在のデリゲートが表すメソッドを動的に呼び出します (遅延バインディング)。

らしいです。ふむ、遅延バインディング、遅延バインディングねぇ。遅延バインディングがなんかヤダって人はキャストしてしまいましょう♪

Option Compare Binary
Option Explicit On
Option Strict On

Imports System

Public Delegate Sub ShowMessageDelegate(ByVal targetName As String)

Public Class Program

    Public Shared Sub Main()

        Dim bufferinMessenger As New Messenger

        bufferinMessenger.SetPhrase("{0} の半分はやさしさで出来ています。")

        Dim showBufferinMessage As ShowMessageDelegate
        showBufferinMessage = AddressOf bufferinMessenger.ShowMessage

        Dim jojoMessenger As New Messenger

        jojoMessenger.SetPhrase("さすが{0}! おれたちにできない事を平然とやってのけるッ そこにシビれる! あこがれるゥ!")

        Dim showJoJoMessage As ShowMessageDelegate
        showJoJoMessage = AddressOf jojoMessenger.ShowMessage

        Dim combinedDelegate As [Delegate] = [Delegate].Combine(showBufferinMessage, showJoJoMessage)

        Dim showMessages As ShowMessageDelegate = DirectCast(combinedDelegate, ShowMessageDelegate)

        showMessages.Invoke("επιστημηさん")

    End Sub

End Class

出力結果は

επιστημηさん の半分はやさしさで出来ています。
さすがεπιστημηさん! おれたちにできない事を平然とやってのけるッ そこにシビれる! あこがれるゥ!

ですね。


どうやらデリゲートは内部にメソッドの呼び出しリストのようなものを持っている雰囲気ですね。今回まで デリゲートで色々遊んでみました。Visual Basic でのデリゲートは Delegate ステートメントによって記述できると言うことは分かりました。で、これって結局なんなの?気になりませんか?私は気になります。


ぢゃ、調べたらいいぢゃん・・・


ですよね♪

投稿日時 : 2007年10月29日 13:13

Feedback

# re: Visual Basic でなんとなくイベントとデリゲート その7。 - デリゲートでもうちょっとだけ遊ぶ - 2007/10/29 16:37 シャノン

ネタ1
http://blogs.wankuma.com/ogiogi/archive/2007/09/21/97441.aspx

ネタ2
http://blogs.wankuma.com/shannon/archive/2007/03/04/64963.aspx

# re: Visual Basic でなんとなくイベントとデリゲート その7。 - デリゲートでもうちょっとだけ遊ぶ - 2007/10/29 17:14 とりこびと

シャノン さん、コメントありがとうございます。

>ネタ1

おぉ♪って参考リンクぢゃないですかw
ネタ元として・・・お勉強しろと♪やりますです。

>ネタ2

奇遇ですねw
最近シャノンさんの嗜好がうつってきていると思っていますww

# re: Visual Basic でなんとなくイベントとデリゲート その7。 - デリゲートでもうちょっとだけ遊ぶ - 2007/10/29 17:27 シャノン

ふと気になった。
ネタ2の「何故senderはobjectなのか」だが、ネタ1によれば、引数の型制限が緩和されたのは C# 2.0 かららしい?
C# 1.0 や VB では厳密に型一致していなければいけないとしたら、それがネタ2の答えになるな。

# re: Visual Basic でなんとなくイベントとデリゲート その7。 - デリゲートでもうちょっとだけ遊ぶ - 2007/10/29 17:35 シャノン

VB.NETは試せる環境が無かったが、C# 2003 では完全一致でないとダメだった。

# re: Visual Basic でなんとなくイベントとデリゲート その7。 - デリゲートでもうちょっとだけ遊ぶ - 2007/10/29 18:13 とりこびと

シャノンさん、コメントありがとうございます。

.NET Framework 2.0 としての緩和でしょうか?
http://msdn2.microsoft.com/ja-jp/library/96b1ayy4(VS.80).aspx

# re: Visual Basic でなんとなくイベントとデリゲート その7。 - デリゲートでもうちょっとだけ遊ぶ - 2007/10/29 18:37 シャノン

そのようですね。
VBでも、2003ではダメで2005以降ならOKということを検証したいところですが、たぶん大丈夫でしょう。
また、これによって、イベントハンドラの第一引数senderがobjectであるのは歴史的事情によるということが確認できましたので、今後は第一引数が非objectなイベントハンドラを定義することも検討していきたいです。

# re: Visual Basic でなんとなくイベントとデリゲート その7。 - デリゲートでもうちょっとだけ遊ぶ - 2007/10/29 20:58 とりこびと

むぅ・・・この件についてVisual Basicでの話がMSDNに書かれていたような気がしたんですけど見つからない・・・。

# re: Visual Basic でなんとなくイベントとデリゲート その7。 - デリゲートでもうちょっとだけ遊ぶ - 2007/10/31 1:19 THREE-ONE

かなりどうでもいいことですが。
バファリンって buffer が in してるから、半分がやらし・・・・じゃなくてやさしさなんですね。

# Visual Basic でなんとなくイベントとデリゲート その8。 - デリゲートって何ぞや? - 2007/11/06 11:37 とりこらぼ。

Visual Basic でなんとなくイベントとデリゲート その8。 - デリゲートって何ぞや? -

# Visual Basic でなんとなくイベントとデリゲート その10。 - イベントの宣言はこんな感じ - 2007/11/09 9:22 とりこらぼ。

Visual Basic でなんとなくイベントとデリゲート その10。 - イベントの宣言はこんな感じ -

タイトル
名前
Url
コメント