在 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。结果是处理程序没有被触发,这个错误只有在集成测试中才发现。
故事
程序员在事件委托的签名中搞错了顺序——交换了
sender和e。没有任何错误消息(事件处理程序根本没有被调用),而必要的业务逻辑隐秘地跳过了直到接近最终发布。