了解/将C#事件访问器代码(特别是+ =运算符)转换为VB

时间:2018-07-25 07:57:49

标签: c# .net vb.net event-handling

我有一些C#代码,我需要将其转换为VB。

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时,将通知该类不包含事件_something。然后我遇到了一些示例代码,这些示例代码似乎使用了我逐字逐句发布的结构。
但是,这使VS抱怨为该事件递归调​​用AddHandler。看来我弄错了事件访问器代码的翻译。

但是在VB中不存在EventHandler.Operator +=,而且我有点奇怪,既然变量something不是集合,为什么它也可以在C#中工作某种形式。我想,如果我理解得正确,我可能会为VB提出一些建议。

显然,对于.NET中的事件,我感到很困惑,尤其是在这种情况下,C#和VB概念之间的联系。

2 个答案:

答案 0 :(得分:1)

C#允许您直接分配给委托字段(“ _something”)调用列表,但VB不允许。 使用Delegate.Combine和Delegate.Remove相当于VB有点冗长(我也把它放在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

答案 1 :(得分:0)

您对(C#)某些字段有哪些特殊需求?您如何在其余的代码中使用它?如果没有任何特殊需要,您可以将整个代码块替换为

Public Event Something 

没别的。

AddHandler和RemoveHandler关键字等效于事件的C#+ =和-=运算符,它们将放置在类外部,例如

Dim X As New SomeType
AddHandler X.Something, AddressOf X_Something
...
RemoveHandler X.Something, AddressOf X_Something

或使用WithEvents关键字(只是为了找出您可能不知道的内容)来省略许多AddHandler / RemoveHandler调用。当使用SomeType的集合时,这不是有用的,但是当使用单个实例时,这是非常有用的。

Private WithEvents fA, fB As New SomeType

Private Sub Handle_Something Handles fA.Something, fB.Something
   'Handle the event
End Sub