编程VB.NET 开发者

描述 Visual Basic .NET 中事件(Events)和委托(Delegates)的工作原理和特点。错误使用时可能会出现什么问题?

用 Hintsage AI 助手通过面试

答案

在 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,假设它一定会生效。经过测试发现,若没有订阅者,则没有任何效果,这导致了应用程序业务逻辑的误解和报告错误。