【问题标题】:VB.NET WithEvents keyword behavior - VB.NET compiler restriction?VB.NET WithEvents 关键字行为 - VB.NET 编译器限制?
【发布时间】:2010-10-24 20:25:32
【问题描述】:

我正在努力让 C# 变得像我对 VB.NET(我的工作场所使用的语言)一样熟悉。学习过程中最好的事情之一是,通过学习另一种语言,您往往会更多地了解您的主要语言——像这样弹出的小问题:

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

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

【问题讨论】:

  • +1 我正在尝试完全反转,这意味着我正在从 C# 学习 VBNET。谢谢你的好问题
  • @Will:玩得开心,VB.NET 因其名称中的“VB”而受到诟病,但这在很大程度上是没有根据的——VB.NET 是一种与 VB 完全不同的语言。请记住,您应该始终设置Option Strict OnOption Explicit On。这两行将在几个默认编译器选项中占主导地位。如果您的经历与我一样,您将了解更多关于这两种语言的知识。
  • 是的,我和 Will 一样,这有助于我理解 WithEvents 的作用:) 再次感谢!

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


【解决方案1】:

省略 WithEvents 不会阻止成员引发事件。它只是阻止您在他们的事件中使用“句柄”关键字。

这是 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

【讨论】:

  • 我想我从来没有注意到这一点——可能是因为我唯一注意到它的时候是当我收到错误时:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多