Phoenix的天空
Any Program

Public Class Form1

    '定义委托
    Private Delegate Sub MyMsg(ByVal str As String)

 

    '实现委托,方法签名与前面定义的委托相同
    Private Sub showmsg(ByVal str As String)
        MessageBox.Show(str & " from showmsg")
    End Sub

 

    '实现另一个委托,,方法签名与前面定义的委托相同
    Private Sub shownamemsg(ByVal str As String)
        MessageBox.Show(str & ",Phoenix" & " from shownamemsg")
    End Sub

 

   '使用委托, 把调用哪个方法的权利下放到执行代码那里
    Private Sub showinfo(ByVal dd As MyMsg, ByVal str As String)
        dd(str)
        '在vb中支持调用invoke
        'dd.Invoke(str)
    End Sub

 

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        '采用了简写形式. 完整形式应该是
        'showinfo(New MyMsg(AddressOf showmsg), "Hello")
        showinfo(AddressOf showmsg, "Hello")

   

     '采用了简写形式.完整形式应该是
        'showinfo(New MyMsg(AddressOf shownamemsg), "Hello")
        showinfo(AddressOf shownamemsg, "Hello")

 

       '委托链表. 依次调用委托链上的每个方法. 注意此处不能采用简写形式
        '以下为错误写法
        'showinfo([Delegate].Combine(AddressOf showmsg, AddressOf shownamemsg), "Hello")
        showinfo([Delegate].Combine(New MyMsg(AddressOf showmsg), New MyMsg(AddressOf shownamemsg)), "Hello")

   

     '用lambda函数代替委托
        showinfo(Sub(str) MessageBox.Show(str & " from lambda"), "Hello")

    End Sub


End Class

posted on 2011-06-29 22:41  Phoenix Huang  阅读(244)  评论(0编辑  收藏  举报