2013-02-08 59 views
-2

我有一個WebService此事件:C#檢查,如果事件是空

public event FindProductsByCharacteristicsCompletedEventHandler FindProductsByCharacteristicsCompleted 
    { 
     [MethodImpl(MethodImplOptions.Synchronized)] 
     add 
     { 
      _findProductsByCharacteristicsCompleted += value; 
     } 
     [MethodImpl(MethodImplOptions.Synchronized)] 
     remove 
     { 
      _findProductsByCharacteristicsCompleted -= value; 
     } 
    } 

和IM然後檢查,如果事件值爲null這個後來在類:

private void OnFindProductsByCharacteristicsOperationCompleted(object arg) 
    { 
     var handler = _findProductsByCharacteristicsCompleted; 
     if (handler == null) 
      return; 
     handler(this, new FindProductsByCharacteristicsCompletedEventArgs(completedEventArgs.Results, completedEventArgs.Error, completedEventArgs.Cancelled, completedEventArgs.UserState)); 
    } 
+0

爲什麼你覺得你需要檢查事件是否爲空?因爲你不需要根據你的代碼來做到這一點,它不能爲空。提供你訂閱當然的事件。 – 2013-02-08 13:34:45

+0

@Ramhound:如果沒有人訂閱這個事件,它就是'null'。不檢查'null'是一個非常糟糕的主意。 – 2013-02-08 13:42:10

+0

@DanielHilgarth - 然後意識到這一點。事件及其處理程序是兩個完全不同的事情。我也有一個「提供」的聲明是有原因的。 – 2013-02-08 13:43:43

回答

2

您事件實現看起來像是一個無限的遞歸。您在實施中使用該屬性本身。
它改成這樣:

private FindProductsByCharacteristicsCompletedEventHandler 
      _findProductsByCharacteristicsCompleted; 

public event FindProductsByCharacteristicsCompletedEventHandler 
       FindProductsByCharacteristicsCompleted 
{ 
    [MethodImpl(MethodImplOptions.Synchronized)] 
    add 
    { 
     _findProductsByCharacteristicsCompleted += value; 
    } 
    [MethodImpl(MethodImplOptions.Synchronized)] 
    remove 
    { 
     _findProductsByCharacteristicsCompleted -= value; 
    } 
} 

而現在,實現你的方法是這樣的:

var handler = _findProductsByCharacteristicsCompleted; 
if(handler == null) 
    return; 

handler(this, new FindProductsByCharacteristicsCompletedEventArgs(...)); 

這樣做的好處在於它是線程安全的。

即使有人在檢查null之後但在實際引發事件之前將最後一個處理程序從事件中分離出來,也不會發生異常,因爲您正在對未更改的局部變量進行操作。

+0

嗯我仍然得到FindProductsByCharacteristicsCompleted'只能出現在左側的+ =或 - =這個錯誤? – PeteTheGreek 2013-02-08 13:36:40

+0

你確定你是在正確的班級嗎? – 2013-02-08 13:37:40

+0

順便說一句:請參閱更新。 – 2013-02-08 13:40:55