我有一些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概念之间的联系。
答案 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