2008-10-30 128 views
8

我有一个类,下载,检查和保存一些大的XML文件。有时候我想让用户界面告诉我发生了什么,但有时我会使用这个类并忽略这些事件。所以,我已经把像这样的代码行中十几个地方:VB.NET:即使没有事件处理程序,是否会引发事件?

RaiseEvent Report("Sending request: " & queryString) 

RaiseEvent Report("Saving file: " & fileName) 

RaiseEvent Report("Finished") 

我的问题是这样的 - 将这些事件减慢我的代码,如果不听他们?他们会开火吗?

回答

6

没有什么魔力,隐藏在RaiseEvent下的代码完全符合你的期望,它遍历一组处理程序并执行每一个。 检查看到的开销是否有任何处理程序是微不足道的,不用担心。

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

而且,除非你需要不担心优化

回复(见本Wikipedia entry明白为什么。):调用GetMystring()

是的,这与您如何在C#中引发事件有关,您可以在事件发生前检查处理程序的存在。 例如: -

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

尼斯实验的方式:)

+0

首先,感谢您对问题的直接回答。其次,你对优化有一个很好的观点。“代码完整(第2版)作者Steve McConnell在代码调整中有一章(25),它基本上写道:”除非你绝对需要并且意识到所涉及的权衡,否则不要优化。“ – 2008-10-30 17:03:22

1

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

作为一个方面说明:在C#中没有处理程序引发事件实际上会导致引发异常。 VB.Net没有这个问题:)

7

我自己的答案:

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

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

RaiseEvent Report(GetMyString()) 

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

+0

@Shane:我更新了我的回答是这样的,谢谢 – 2008-10-30 18:51:37

0

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

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

相关问题