2014-02-06 57 views
0

我打算通過下面這段代碼:爲什麼額外的if語句在調用它之前檢查一個事件是否爲空?

public delegate void PersonArrivedEventHandler(string personName, byte[] personId); 

    public class SCLib 
    { 
     public event personArrivedEventHandler personrrived; 

     public SCLib() 
     { 
      // Simulate that the person arrived after 2000 milli-seconds. 
      Task.Run(() => 
      { 
       System.Threading.Thread.Sleep(2000); 
       OnPersonArrived("personName", new byte[] { 0x20, 0x21, 0x22 }); 
      }); 
     } 

     protected virtual void OnPersonArrived(string smartCardReaderName, byte[] smartCardId) 
     { 
      if (this.personArrived != null) 
      { 
       PersonArrived(personName, personId); 
      } 
     } 
    } 

但是,我不知道這是什麼線的意義, if (this.personArrived != null)

爲什麼在這裏完成此檢查?這裏有if statement有什麼意義嗎?我刪除了這一行並運行該程序,一切都如以前那樣運行。

謝謝。

+1

「我剛從房子裏取出所有的煙霧探測器,其中的所有東西都像以前一樣工作,所以我猜煙霧探測器是不必要的。否:除煙霧探測器之外的所有東西都像以前一樣工作。當您卸下安全系統不再運行的安全系統時。 –

+0

@EricLippert:很好的比喻。有道理。 –

回答

1

如果該事件未被class的消費者訂閱,則調用event將引發異常,因爲如果未訂閱,PersonArrived爲空。

+0

謝謝,剛剛檢查沒有訂閱事件,並且它是空的,正如你所說。但是在內部,一個班級如何知道某人是否已經訂閱了它的活動? –

+1

如果它將被調用的對象沒有訂閱它,它將爲空。 – Adil

+0

謝謝。說得通。 「但在內部,一個班級如何知道某人有沒有訂閱它的活動?」。那麼答案是:通過它的對象狀態。 –

1

如果您使用的事件沒有分配處理程序,它將生成一個異常,因爲它是空的,所以您需要在啓動事件前檢查它。

1

因爲如果沒有委託人附加到事件,它將爲空。如果您嘗試調用這樣的空事件,您將獲得標準NullReferenceException

1

「事件」由類對象使用添加處理程序進行訂閱。

SCLibObject.personrrived += new personArrivedEventHandler(somemethod)

如果類對象不同意的情況下,那麼你會得到NullReferenceException。所以在調用事件之前檢查它是否爲空。

1

在多線程應用程序中,您應該在調用之前將事件處理程序存儲在本地變量中。有關更多詳細信息,請參閱this SO answerthis blog post from Eric Lippertthis SO answer

void SomeEventInvoke(object sender, EventArgs args) { 
    EventHandler ev = SomeEvent; 
    if (ev != null) ev(sender, args); 
} 
+0

謝謝。鏈接似乎非常有用。 –

相關問題