如何:在.NET中使用事件

背景

事件是对象发出的一条消息,用于通知其他对象发生了操作/触发/状态更改(即事件)。 因此,当对象的状态更改也需要其他对象更改时,也应使用事件。

发送事件的对象称为

事件发送者

接收(或监听)事件的对象称为

事件接收者

活动实施“

“观察者设计模式 ”。该模式包含两个关键对象:一个主题(事件发送者)和一个观察者(事件接收者)。该主题可以具有一个或多个观察者。

委托用于在发送方和接收方对象之间进行通信,因为发送方不知道哪种对象类型可能正在接收(或处理)事件。 委托将事件与其接收方(或处理程序)相连。

回想一下,在.NET中,Delegates是充当函数指针的类。 它们持有方法的引用(内存位置)。 还请记住,委托只能保留对其签名匹配的方法的引用。

委托标识提供对事件的响应并保存事件数据的方法。

使用通用事件(EventHandler委托)

通用事件处理程序委托已在.NET Framework 2.0中提供。 它称为EventHandler。

EventHandler委托持有对方法的引用,该方法处理引发的不包含事件数据的事件。 换句话说,它表示将处理典型事件的方法。

EventHandler委托的签名如下:


Public Delegate Sub EventHandler(ByVal sender As Object, ByVal e As EventArgs)

public delegate void EventHandler(Object sender, EventArgs e) 
  • “发送者”参数是引发事件的对象。
  • “ e”参数是事件参数,这些参数被传递回接收对象,并包含有关事件的数据。 由于事件不会生成事件数据,因此此参数是EventArgs的实例。
  • 如果您要求事件生成事件数据(接收对象可以使用该数据来处理某些事件),则不能使用EventHandler。 相反,您必须使用EventHandler <T>。 下一节将对此进行详细说明。

因此,如果您需要引发一个不生成事件数据的事件,则可以将事件声明为:


    Public Event NoDataEventHandler As EventHandler
    'EventHandler is the delegate that holds a reference to a method with the signature: (Object sender, EventArgs e)
    'You do not need to create a delegate called EventHandler as this is now part of the System class 
然后在您的发送者类中引发事件将执行以下操作:

Private Sub OnMyEvent()
   RaiseEvent NoDataEventHandler(Me, New EventArgs())
End Sub 
使用返回事件数据的事件(EventHandler <T>委托)

如果在引发事件时需要将数据传递给接收对象,则不能使用EventHandler委托。 相反,您需要使用EventHandler <T>。

由于您的事件会生成事件数据,因此您必须首先创建一个自定义类型来保存此数据。 此自定义类型必须从EventArgs派生。


Public Class MyObjectsEventArgs
     Inherits EventArgs
     Private _theEventData As String
     Public Sub New(ByVal eventData As String)
          _theEventData = eventData
End Sub
Public Property Message() As String
        Get
            Return _theEventData
        End Get
        Set(ByVal value As String)
            _theEventData = value
        End Set
    End Property
End Class 
现在,由于无法使用通用EventHandler,因此需要使用EventHandler <T>委托创建一个Delegate:

     Public Delegate Sub XEventHandler(Of MyObjectsEventArgs)(ByVal sender as Object, ByVal e As MyObjectsEventArgs)
    'Note that MyObjectsEventArgs is the custom type derived from EventArgs used to pass the event data to the receiving class. 
请记住,必须在引发事件的Class之外声明Delegates。 另外,请注意,这是一个公共代表。 它必须是Public,以便接收对象能够访问它。

如果您声明代表为:

     Public Delegate Sub XEventHandler(ByVal sender as Object, ByVal e As MyObjectsEventArgs)
     'Note that MyObjectsEventArgs is the custom type derived from EventArgs used to pass the event data to the receiving class. 
您将收到来自编译器的警告(使用代码分析运行):
...为使用以下模式的事件生成EventHandler委托:Event MyEvent(ByVal Sender As Object,ByVal e As MyEventArgs)。 将定义EventHandler'EventHandler'的事件更改为使用EventHandler <T> ...”
抱怨您声明的是使用EventHandler签名的委托,但您不在签名中使用EventArgs。
现在您有了一个委托来链接发送者和接收者类,您可以将事件声明为:

     Public Event SendMessageEvent As XEventHandler(Of MyObjectsEventArgs) 
请记住,您在发送者类中声明了事件。 还应将其公开,以让接收器类处理。

要在发件人代码中引发事件,请执行以下操作:


Private Sub OnMyEvent(ByVal message As String)
     RaiseEvent SendMessageEvent(Me, New MyObjectsEventArgs(message))
End Sub 
在您的接收类中,您需要创建一个与委托人签名匹配的方法来处理事件:

Private Sub TestEventSending_theEvent(ByVal sender As Object, ByVal e As MyObjectsEventArgs) Handles TestEventSending.SendMessageEvent 
    'Note that "TestEventSending" is the instance of the Sender Object used in my Receiving Object
    Label_Message = e.Message
    'e is an instance of the MyObjectsEventArgs class we implemented to be able to send event data to the receiving object for it to use
    'Recall that Message is a property of MyObjectsEventArgs that we defined to hold our event data
End Sub 
参考和资源 EventHandler通用委托 EventHandler(TEventArgs)通用委托

From: https://bytes.com/topic/net/insights/760508-how-use-events-net

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值