编程VB.NET 开发人员

描述 Visual Basic 中的事件机制 (Events) 并给出创建自定义事件的示例。在声明和订阅时需要注意什么?

用 Hintsage AI 助手通过面试

答案

在 Visual Basic 中,事件 (Events) 允许对象通知应用程序的其他组件有关发生的更改。事件通过关键字 Event 声明。可以通过 RaiseEvent 方法 (VB.NET) 或 Raise (VB6) 调用事件,组件可以订阅该事件 (Handles/WithEvents)。

示例 VB.NET:

Public Class Worker Public Event WorkCompleted As EventHandler Public Sub DoWork() ' ...进行某项工作 RaiseEvent WorkCompleted(Me, EventArgs.Empty) End Sub End Class Public Class Manager Private WithEvents w As Worker Public Sub New() w = New Worker() End Sub Private Sub w_WorkCompleted(sender As Object, e As EventArgs) Handles w.WorkCompleted Console.WriteLine("工作完成!") End Sub End Class

重要事项:

  • 事件只能在声明它的同一类中被调用
  • 如果事件有参数,其类型必须严格定义
  • WithEvents 只能与类的字段和属性一起使用
  • 订阅事件后,必要时别忘了注销订阅(例如,以避免内存泄漏)

反向问题

是否可以使用访问修饰符 Private 来声明事件,并从其他类中订阅它?

答案: 不可以,Private 修饰符限制了事件的可见性,仅限于它被声明的类。其他类无法看到它,因此无法订阅。

由于对主题细节不了解而导致的实际错误示例


故事

在一个大型应用中,事件以 Public 修饰符创建,但从未明确注销订阅。随着应用程序的长期运行,这导致了内存泄漏,因为处理程序引用了不必要的对象。


故事

在从 VB6 迁移到 VB.NET 的过程中,开发人员期望事件在所有模块中可用,但默认情况下事件是 Friend。结果是处理程序没有被触发,这个错误只有在集成测试中才发现。


故事

程序员在事件委托的签名中搞错了顺序——交换了 sendere。没有任何错误消息(事件处理程序根本没有被调用),而必要的业务逻辑隐秘地跳过了直到接近最终发布。