VB.NET:即使没有事件处理程序,也会引发事件吗?
我有一个类可以下载、检查和保存一些大型XML文件。有时我希望UI告诉我发生了什么,但有时我会使用类并忽略事件。所以我在十几个地方放置了这样的代码行: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") 我的问题是——如果没有任何东西在监听这些事件,它们会减慢我的代码吗?他
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())