【发布时间】:2013-02-26 03:54:52
【问题描述】:
请看下面的代码,它按我的预期工作:
Partial Class _Default
Inherits System.Web.UI.Page
Delegate Sub TestEventHandler(ByVal o As Object, ByVal e As EventArgs)
Dim alhandler As TestEventHandler = AddressOf TestEventMethod
Public Event Test1 As TestEventHandler
Public Event Test2 As TestEventHandler
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
AddHandler Me.Test1, alhandler
AddHandler Me.Test2, alhandler
RaiseEvent Test1(Me, e)
RaiseEvent Test2(Me, e)
RemoveHandler Me.Test1, alhandler
RaiseEvent Test1(Me, e)
End Sub
Public Sub TestEventMethod(ByVal o As Object, ByVal e As EventArgs)
MsgBox("Test")
End Sub
End Class
我对以下两种说法感到困惑:
Dim alhandler As TestEventHandler = AddressOf TestEventMethod '1
Public Event Test1 As TestEventHandler '2
1) 这是说 alHandler 的引用是一个委托 指向函数的地址。 2)这是说 Test1 是 委托类型的事件。事件和处理程序如何成为 委托?
【问题讨论】:
-
事件处理程序只是代表的一个特定的
type。 -
@罗伯特哈维,谢谢。其他类型的代表是什么?
-
那些不是事件处理程序的。 :) 您可以定义具有您想要的任何签名的委托类型。但是,既然你问了,这是框架中定义的另一个示例:Action<T>。
-
Test1 变量是事件还是委托还是两者兼而有之?
-
所有事件都是委托,但事件具有特定的签名和编译器支持。例如,您可以
RaiseEvent。