在 Visual Basic .NET 中,委托(Delegate)是封装对方法的引用的对象,而事件(Events)是通知订阅者特定条件或变化发生的机制。委托允许像参数一样“传递”行为(方法),而事件实现了发布-订阅模式。
特点:
Event 在类内声明。AddHandler 完成,退订通过 RemoveHandler 完成。示例:
' 定义委托 Public Delegate Sub NotifyHandler(ByVal message As String) ' 带有事件的类 Public Class Notifier Public Event OnNotify As NotifyHandler Public Sub DoWork() RaiseEvent OnNotify("工作完成!") End Sub End Class ' 订阅和调用 Dim n As New Notifier() AddHandler n.OnNotify, AddressOf SubNotify Sub SubNotify(ByVal msg As String) Console.WriteLine(msg) End Sub n.DoWork()
事件在 UI 编程和业务逻辑调度中尤其有用。
如果调用事件 RaiseEvent,而没有订阅者,会发生什么?
错误答案: 将会出现运行时错误。
正确答案: 什么也不会发生 — 如果事件没有订阅者,调用 RaiseEvent 是安全的,不会抛出异常。
示例:
Public Event OnUpdate() ' 即使没有人订阅,调用 RaiseEvent: RaiseEvent OnUpdate() ' 允许且不会导致错误
故事
在一个大型桌面应用程序中,开发者没有从事件中退订处理程序,导致对象没有被垃圾收集器释放(内存泄漏)。这导致内存增长,并在几小时的运行后出现崩溃。
故事
一位年轻的专业人士在不理解委托和事件的工作原理时,意外地多次订阅一个方法。这导致相同的处理程序被多次调用 — 用户收到了重复的通知。
故事
在一个项目中,调用了事件RaiseEvent,假设它一定会生效。经过测试发现,若没有订阅者,则没有任何效果,这导致了应用程序业务逻辑的误解和报告错误。