【问题标题】:AddHandler vs. Handles - what is the difference?AddHandler 与 Handles - 有什么区别?
【发布时间】:2010-01-18 11:02:18
【问题描述】:

【问题讨论】:

    标签: vb.net handles addhandler


    【解决方案1】:

    在附加事件处理程序的确切时间以及周围发生的事情方面存在一些差异。例如,当使用WithEventsHandles 时,编译器将发出代码来包装对持有实例的变量的访问,该实例在属性中公开事件,并且在属性设置器中它将事件处理程序与前一个实例分离(如果有),然后将事件处理程序附加到新实例(如果有)。

    这意味着,如果您采用以下代码示例,对mm 的访问将表现不同:

    ' WithEvents approach '
    Dim WithEvents mm As SomeClass
    Sub Main()
        mm = New SomeClass()
        Dim nn As SomeClass = mm
    End Sub
    
    ' Other approach '
    Dim mm As SomeClass
    Sub Main()
        mm = New SomeClass()
        Dim nn As SomeClass = mm
    End Sub
    

    WithEvents 的情况下,mm = New SomeClass() 实际上会调用属性设置器,Dim nn As SomeClass = mm 将从属性获取器中获取值,而在第二种情况下,不会为该值创建任何属性,但代码将直接访问该字段。

    【讨论】:

    • 换句话说,使用 AddHanlderresources 和速度是最佳的,而 WithEvents 对于代码可读性?..
    • 当对象不再引用它时,如何分离事件处理程序?
    • @serhio:我认为使用WithEvents 提高可读性可能会引起争议,但总的来说我认为你是对的。 WithEvents 还具有在将字段设置为 Nothing 时分离事件处理程序的机制,这很好(如果您未能分离事件处理程序,它们将阻止对象被垃圾收集)。
    • 一点点精确:如果我在某处替换 mm = otherInstanceOfSomeClass,新的 mm 是否会跟随事件?
    【解决方案2】:
    Private Sub Button1_Click(ByVal sender As System.Object, _
                              ByVal e As System.EventArgs) Handles Button1.Click
    
    End Sub
    Private Sub Button2_Click(ByVal sender As System.Object, _
                              ByVal e As System.EventArgs)
    
    End Sub
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'this
    
        AddHandler Button2.Click, AddressOf Button2_Click
    
        'now Button2_Click looks like this
    
        'Private Sub Button2_Click(ByVal sender As System.Object, _
        'ByVal e As System.EventArgs) Handles Button2.Click
    
    End Sub
    

    【讨论】:

    • 也许吧。您只是忘记了析构函数行为,其中 Handles 还将从按钮中删除处理程序。
    猜你喜欢
    • 1970-01-01
    • 2011-01-13
    • 2023-03-15
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 2013-03-14
    • 2018-09-14
    相关资源
    最近更新 更多