VB.NET:即使没有事件处理程序,事件也会引发?

时间:2008-10-30 15:05:17

标签: .net vb.net performance events

我有一个下载,检查和保存一些大型XML文件的类。有时我希望UI告诉我发生了什么,但有时我会使用该类并忽略事件。所以我在十几个地方放置了这样的代码行:

RaiseEvent Report("Sending request: " & queryString)

RaiseEvent Report("Saving file: " & fileName)

RaiseEvent Report("Finished")

我的问题是 - 如果没有人在听他们的话,这些事件会减慢我的代码吗?他们甚至会开枪吗?

4 个答案:

答案 0 :(得分:7)

我自己的回答:

在VB.NET中,如果没有设置处理程序来监听事件,则不会触发事件。

我做了一个小实验,其中引发事件的代码传递了函数的结果,并且该函数仅在设置了事件处理程序来处理事件时执行。

RaiseEvent Report(GetMyString())

换句话说,我说除非处理程序确实存在,否则不会调用上面的GetMystring函数。

答案 1 :(得分:6)

没有魔法,隐藏在RaiseEvent下的代码完全符合您的期望,它遍历一组处理程序,并执行每一个。 检查是否有任何处理程序的开销很小,不用担心。

如果您的 REAL 问题是“为了节省时间,我应该在提升事件之前检查事件是否有处理程序?” 。 。 。然后答案是“不”,这样做你就什么也得不到。

此外,除非您需要,否则不要担心优化(请参阅此Wikipedia entry了解原因。)

回复:致电GetMystring()

是的,这与您在C#中如何引发事件有关,在这里您可以在引发事件之前检查处理程序是否存在。 E.g:

if (MyEvent != null)
    MyEvent(GetMyString())

顺便说一下好的实验:)

答案 2 :(得分:1)

可能会有少量开销,但我不担心。当然,实际行动将成为性能驱动因素。

作为旁注:在C#中提出没有处理程序的事件实际上会导致抛出异常。 VB.Net没有这个问题:)

答案 3 :(得分:0)

  

如果您的真实问题是“为了节省时间,我应该检查一下这些事件   在提出事件之前有处理程序吗?“......然后答案是   “不”,这样做你什么也得不到。

在C#中,如果你没有检查事件为null并且没有注册处理程序,你将得到一个NullReferenceException。