vb.net - 句柄与 AddHandler

标签 vb.net .net-3.5 garbage-collection

动态附加/分离事件处理程序有优势吗?

手动分离处理程序是否有助于确保没有剩余对已处置对象的引用?

最佳答案

我很确定 Handles 子句只是语法糖,并将 AddHandler 语句插入到您的构造函数中。我使用这段代码进行了测试并禁用了应用程序框架,因此构造函数不会有额外的东西:


Public Class Form1

    Public Sub New()
        ' This call is required by the Windows Form Designer. '
        InitializeComponent()

        ' Add any initialization after the InitializeComponent() call. '
        AddHandler Me.Load, AddressOf Form1_Load
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim breakpoint As Integer = 4
    End Sub
End Class

IL 最终是这样的:

  IL_0000:  nop
  IL_0001:  ldarg.0
  IL_0002:  call       instance void [System.Windows.Forms]System.Windows.Forms.Form::.ctor()
  IL_0007:  nop
  IL_0008:  ldarg.0
  IL_0009:  ldarg.0
  IL_000a:  dup
  IL_000b:  ldvirtftn  instance void WindowsApplication1.Form1::Form1_Load(object,
                                                                           class [mscorlib]System.EventArgs)
  IL_0011:  newobj     instance void [mscorlib]System.EventHandler::.ctor(object,
                                                                          native int)
  IL_0016:  call       instance void [System.Windows.Forms]System.Windows.Forms.Form::add_Load(class [mscorlib]System.EventHandler)

 '... lots of lines here '

  IL_0047:  ldarg.0
  IL_0048:  callvirt   instance void WindowsApplication1.Form1::InitializeComponent()
  IL_004d:  nop
  IL_004e:  ldarg.0
  IL_004f:  ldarg.0
  IL_0050:  dup
  IL_0051:  ldvirtftn  instance void WindowsApplication1.Form1::Form1_Load(object,
                                                                           class [mscorlib]System.EventArgs)
  IL_0057:  newobj     instance void [mscorlib]System.EventHandler::.ctor(object,
                                                                          native int)
  IL_005c:  callvirt   instance void [System.Windows.Forms]System.Windows.Forms.Form::add_Load(class [mscorlib]System.EventHandler)
  IL_0061:  nop
  IL_0062:  nop
  IL_0063:  ret
} // end of method Form1::.ctor

注意 IL_000b 和 IL_0051 周围的两个相同代码块。我认为这只是语法糖。

关于vb.net - 句柄与 AddHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57567/

相关文章:

xml - 使用 VB.NET 遍历 XML 文件

.net - 自定义Windows窗体滚动条

C# COM 类 - DISP_E_UNKNOWNNAME

c# - 应该如何管理在函数范围内声明的定时器的清理?

c - Objective-C 2.0 垃圾收集是否收集 C 结构?

android.view.ViewRootimpl$RunQueue$HandlerAction 防止 Dialog 被垃圾回收

vb.net - 如何围绕无边框表格绘制轮廓?

c# - 在 Visual Studio 中使用参数 Access 查询

c# - 使用 LINQ 使用现有数组对列表进行排序

c# - 在单击事件处理程序中从 ToolStripMenuItem 和 Button 获取 Tag 属性