我有一个下载,检查和保存一些大型XML文件的类。有时我希望UI告诉我发生了什么,但有时我会使用该类并忽略事件。所以我在十几个地方放置了这样的代码行:
RaiseEvent Report("Sending request: " & queryString)
RaiseEvent Report("Saving file: " & fileName)
RaiseEvent Report("Finished")
我的问题是 - 如果没有人在听他们的话,这些事件会减慢我的代码吗?他们甚至会开枪吗?
答案 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。