Handles vs. AddHandler

前端 未结 7 427
花落未央
花落未央 2021-01-15 18:53

Is there an advantage to dynamically attaching/detaching event handlers?

Would manually detaching handlers help ensure that there isn\'t a reference remaining to a d

相关标签:
7条回答
  • 2021-01-15 19:31

    I'm pretty sure that the Handles clause is just syntactic sugar and inserts an AddHandler statement into your constructor. I tested using this code and disabled the application framework so the constructor wouldn't have extra stuff:

    
    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

    The IL ended up like this:

      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

    Notice two identical blocks of code around IL_000b and IL_0051. I think it's just syntactic sugar.

    0 讨论(0)
提交回复
热议问题