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

VB.NET:即使没有事件处理程序,也会引发事件吗?,.net,vb.net,performance,events,.net,Vb.net,Performance,Events,我有一个类可以下载、检查和保存一些大型XML文件。有时我希望UI告诉我发生了什么,但有时我会使用类并忽略事件。所以我在十几个地方放置了这样的代码行: RaiseEvent Report("Sending request: " & queryString) RaiseEvent Report("Saving file: " & fileName) RaiseEvent Report("Finished") 我的问题是——如果没有任何东西在监听这些事件,它们会减慢我的代码吗?他

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

RaiseEvent Report("Sending request: " & queryString)

RaiseEvent Report("Saving file: " & fileName)

RaiseEvent Report("Finished")

我的问题是——如果没有任何东西在监听这些事件,它们会减慢我的代码吗?他们会开火吗?

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


附带说明:在C#中引发没有处理程序的事件实际上会引发异常。VB.Net没有这个问题:)

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

如果您的REAL问题是“为了节省时间,我是否应该在引发事件之前检查事件是否具有处理程序?”。那么答案是“不”,这样做你将一无所获

此外,除非您需要,否则不要担心优化问题(查看此图以了解原因)

回复:调用
GetMystring()

是的,这与在C#中引发事件的方式有关,在C#中,在引发事件之前检查是否存在处理程序。 例如:

顺便说一下,这个实验很好:)

我自己的答案:

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

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

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

如果你真正的问题是“为了节省时间,我是否应该检查事件 在引发事件之前是否有处理程序。那么答案是 “不”,你这样做什么也得不到


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

首先,感谢您对问题的直接回答。第二,关于优化,你提出了一个很好的观点。Steve McConnell的《代码完成》(第二版)中有一章(25)是关于代码调优的,基本上是说“除非你必须进行优化,否则不要进行优化,并且要意识到所涉及的权衡。”事实上,你应该将这个(你自己的)条目标记为答案,确实如此。
RaiseEvent Report(GetMyString())