2008-10-30 63 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。