【问题标题】:WithEvents vs AddHandler in VB.NetVB.Net 中的 WithEvents 与 AddHandler
【发布时间】:2015-06-07 11:49:41
【问题描述】:

我问自己两者之间有什么区别

Dim WithEvents EClass As New EventClass

AddHandler Obj.XEvent, AddressOf Me.XEventHandler

在哪种情况下应该使用第一个或第二个?

谁能解释一下?谢谢。

【问题讨论】:

  • 第一个只是声明一个能够引发事件的对象变量。第二个实际上为事件附加了一个事件处理程序。如果您因为它不是 UI 对象而执行第一个,那么您还需要第二个。没有“对”
  • ...实际上,在 VB 中,第一条语句将允许 IDE 在 2 个编辑器下拉列表中公开所有 EventClass 事件。第二个允许您将事件连接到您键入的方法,而不是让 IDE 从 Object-Event 下拉菜单中创建。

标签: vb.net events addhandler


【解决方案1】:

WithEvents 支持 Handles 关键字。您可以将其应用于方法。当 VB.NET 编译器遇到它时,它会在自动调用 AddHandler 的类的构造函数中生成代码。这样就不用自己写了。

它对设计师来说非常方便,例如 WPF 和 Winforms 设计师都依赖它。它消除了在删除事件处理程序时出现构建错误的可能性,您不能忘记也删除 AddHandler 语句。它与以前版本的 Visual Basic(如 VB6)编写的代码非常兼容。这使得转换旧项目更容易。可能 WithEvents 是在 .NET 中实现的主要原因,C# 没有类似的东西。

真的不喜欢它也是有充分理由的。它有一个令人讨厌的问题,直到今天仍未解决。为了支持 Edit and Continue,编译器在 Debug 构建中创建 WeakReferences。调试器确保这些 WeakReference 对象被再次清理。在没有调试器的情况下运行时不会发生这种情况。这是一个最终会导致程序崩溃的泄漏,尽管这需要一段时间。这使得您只部署 VB.NET 程序的 Release 版本非常重要。

【讨论】:

    猜你喜欢
    • 2014-10-22
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-23
    • 1970-01-01
    • 2010-10-24
    相关资源
    最近更新 更多