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



我有这段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。看来我对事件访问器代码的翻译完全错了。

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

很明显,我对.NET中事件的情况相当困惑,尤其是对C#和VB概念在这种情况下的关系。

C#允许您直接分配给委托字段("_something"(调用列表,但VB不允许。使用Delegate.Combine和Delegate.Remove(我还加入了RaiseEvent块(,VB的等效程序有点冗长:

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

您对(C#(something字段有什么特殊需求?如何在代码的其余部分中使用它?如果没有任何特殊需求,你可以用替换整个代码块

Public Event Something 

什么都没有。

与事件的C#+=和-=运算符等效的是AddHandler和RemoveHandler关键字,它们将被放置在类(如(之外

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

相关内容

最新更新