VB.NET WithEvents关键字行为 - VB.NET编译器限制?

时间:2009-05-08 16:30:33

标签: c# .net vb.net clr vb.net-to-c#

我正在努力熟悉C#,就像我使用VB.NET(我工作场所使用的语言)一样。关于学习过程最好的事情之一就是通过了解另一种语言,你倾向于更多地了解你的主要语言 - 这样的问题很少出现:

根据我发现的消息来源和过去的经验,VB.NET中声明为 WithEvents 的字段能够引发事件。我知道C#没有直接的等价物 - 但我的问题是:字段没有 VB.NET中的这个关键字无法引发事件,有没有办法在C#中创建相同的行为? VB编译器是否只是阻止这些对象处理事件(实际上允许它们像往常一样引发事件)?

我只是好奇;我对这个问题没有任何特别的申请......

1 个答案:

答案 0 :(得分:20)

省略WithEvents不会阻止成员引发事件。它只是阻止你在事件中使用'handles'关键字。

以下是WithEvents的典型用法:

Class C1
    Public WithEvents ev As New EventThrower()
    Public Sub catcher() Handles ev.event
        Debug.print("Event")
    End Sub
End Class

这是一个不使用WithEvents的类,大致相当于。它说明了为什么WithEvents非常有用:

Class C2
    Private _ev As EventThrower
    Public Property ev() As EventThrower

        Get
            Return _ev
        End Get

        Set(ByVal value As EventThrower)
            If _ev IsNot Nothing Then
                    removehandler _ev.event, addressof catcher
            End If
            _ev = value
            If _ev IsNot Nothing Then
                    addhandler _ev.event, addressof catcher
            End If
        End Set
    End Property

    Public Sub New()
        ev = New EventThrower()
    End Sub

    Public Sub catcher()
        Debug.print("Event")
    End Sub
End Class