在 C# 中,您可以执行以下操作:
if (Changed != null)
Changed(this, EventArgs.Empty);
但是您在 VB.NET 中做什么呢?
有RaiseEvent
, but is
RaiseEvent Changed(Me, EventArgs.Empty)
实际检查某些内容是否已订阅该事件?
与 C# 的等价物不同,RaiseEvent
在 VB.NET 中将not如果没有侦听器,则会引发异常,因此并不严格需要首先执行空检查。
但如果您无论如何都想这样做,有一个语法可以实现。你只需要添加Event
作为事件名称末尾的后缀。 (如果不这样做,则会出现编译器错误。)例如:
If ChangedEvent IsNot Nothing Then
RaiseEvent Changed(Me, EventArgs.Empty)
End If
不过,正如我上面所说,我不确定这样做是否有任何真正的好处。它使您的代码变得不惯用并且更难以阅读。我在这里介绍的技巧并没有特别详细的记录,大概是因为整个要点RaiseEvent
关键字是在后台为您处理所有这些。这样更加方便和直观,这是 VB.NET 语言的两个设计目标。
您应该让其自动处理的另一个原因是,以 C# 方式执行此操作时很难正确处理。您显示的示例片段实际上包含竞争条件,即等待发生的错误。更具体地说,它不是线程安全的。您应该创建一个临时变量来捕获当前的事件处理程序集,then进行空检查。像这样的事情:
EventHandler tmp = Changed;
if (tmp != null)
{
tmp(this, EventArgs.Empty);
}
Eric Lippert 有一篇关于此的很棒的博客文章here http://blogs.msdn.com/b/ericlippert/archive/2009/04/29/events-and-races.aspx,灵感来自于这个堆栈溢出问题 https://stackoverflow.com/questions/786383/c-sharp-events-and-thread-safety.
有趣的是,如果您检查反汇编的 VB.NET 代码,该代码使用RaiseEvent
关键字,你会发现它所做的正是上面的事情correctC# 代码的作用是:声明一个临时变量,执行 null 检查,然后调用委托。为什么每次都让你的代码变得混乱呢?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)