VB.Net 中的 WithEvents 与 AddHandler
WithEvents vs AddHandler in VB.Net
我问自己这两者有什么区别
Dim WithEvents EClass As New EventClass
和
AddHandler Obj.XEvent, AddressOf Me.XEventHandler
在哪种情况下应该使用第一个还是第二个?
谁能解释一下?谢谢
WithEvents 支持 Handles
关键字。您可以将其应用于方法。当VB.NET 编译器遇到它时,它会在class 的构造函数中生成自动调用AddHandler 的代码。所以你不必自己写。
对设计者来说非常方便,例如WPF和Winforms的设计者都依赖它。它消除了在删除事件处理程序时出现构建错误的可能性,您不能忘记也删除 AddHandler 语句。而且它与用早期版本的 Visual Basic 编写的代码非常兼容,例如 VB6。这使得转换旧项目变得更加容易。可能是 WithEvents 在 .NET 中实现的主要原因,C# 没有类似的东西。
真正不喜欢它也是有充分理由的。它有一个令人讨厌的问题,直到今天仍然没有解决。为了支持编辑并继续,编译器在调试版本中创建了 WeakReferences。调试器确保再次清除那些 WeakReference 对象。当你 运行 没有调试器时,这不会发生。这是一个最终会使您的程序崩溃的泄漏,尽管这需要一段时间。这使得 非常 只部署 VB.NET 程序的发布版本非常重要。
我问自己这两者有什么区别
Dim WithEvents EClass As New EventClass
和
AddHandler Obj.XEvent, AddressOf Me.XEventHandler
在哪种情况下应该使用第一个还是第二个?
谁能解释一下?谢谢
WithEvents 支持 Handles
关键字。您可以将其应用于方法。当VB.NET 编译器遇到它时,它会在class 的构造函数中生成自动调用AddHandler 的代码。所以你不必自己写。
对设计者来说非常方便,例如WPF和Winforms的设计者都依赖它。它消除了在删除事件处理程序时出现构建错误的可能性,您不能忘记也删除 AddHandler 语句。而且它与用早期版本的 Visual Basic 编写的代码非常兼容,例如 VB6。这使得转换旧项目变得更加容易。可能是 WithEvents 在 .NET 中实现的主要原因,C# 没有类似的东西。
真正不喜欢它也是有充分理由的。它有一个令人讨厌的问题,直到今天仍然没有解决。为了支持编辑并继续,编译器在调试版本中创建了 WeakReferences。调试器确保再次清除那些 WeakReference 对象。当你 运行 没有调试器时,这不会发生。这是一个最终会使您的程序崩溃的泄漏,尽管这需要一段时间。这使得 非常 只部署 VB.NET 程序的发布版本非常重要。