首页 > 解决方案 > 理解/翻译 C# 事件访问器代码(特别是 += 运算符)到 VB

问题描述

我有一些需要翻译成 VB 的 C# 代码。

private EventHandler something = null;

public event EventHandler Something
{
    add
        { this.something += value; }
    remove
        { this.something -= value; }
}

到目前为止,我已经想出了这个(我知道它缺少 RaiseEvent 位):

Private _something As EventHandler = Nothing

Public Custom Event Something As EventHandler
    AddHandler(ByVal value As EventHandler)
        AddHandler Me.Something, value
    End AddHandler
    RemoveHandler(ByVal value As EventHandler)
        RemoveHandler Me.Something, value
    End RemoveHandler
End Event

当内部 AddHandler 被AddHandler Me._something, value告知该类不包含 Event 时_something。然后我遇到了一些示例代码,这些代码似乎使用了我逐字发布的结构。
然而,这使得 VS 抱怨为事件递归调​​用 AddHandler。所以看来我把事件访问器代码的翻译都弄错了。

然而,EventHandler.Operator+=在 VB 中不存在,我有点想知道为什么它会在 C# 中工作,因为该变量something不是某种集合。我想如果我正确理解这一点,我可能会为 VB 想出一些东西。

显然,我对 .NET 中的事件情况感到相当困惑,特别是在这种情况下 C# 和 VB 概念如何相关。

标签: c#.netvb.netevent-handling

解决方案


C# 允许您直接分配给委托字段(“_something”)调用列表,但 VB 不允许。VB 等价物有点冗长,使用 Delegate.Combine 和 Delegate.Remove (我也加入了 RaiseEvent 块):

Private _something As EventHandler = Nothing

Public Custom Event Something As EventHandler
    AddHandler(ByVal value As EventHandler)
        Me._something = DirectCast(System.Delegate.Combine(Me._something, DirectCast(value, EventHandler)), EventHandler)
    End AddHandler
    RemoveHandler(ByVal value As EventHandler)
        Me._something = DirectCast(System.Delegate.Remove(Me._something, DirectCast(value, EventHandler)), EventHandler)
    End RemoveHandler
    RaiseEvent(ByVal sender As System.Object, ByVal e As System.EventArgs)
        If Me._something IsNot Nothing Then
            Me._something.Invoke(sender, e)
        End If
    End RaiseEvent
End Event

推荐阅读