C# 检查事件是否为空

C# 检查事件是否为空,c#,events,null,C#,Events,Null,我在Web服务中有此事件: public event FindProductsByCharacteristicsCompletedEventHandler FindProductsByCharacteristicsCompleted { [MethodImpl(MethodImplOptions.Synchronized)] add { _findProductsByCharacteristicsCompleted

我在Web服务中有此事件:

public event FindProductsByCharacteristicsCompletedEventHandler FindProductsByCharacteristicsCompleted
    {
        [MethodImpl(MethodImplOptions.Synchronized)]
        add
        {
            _findProductsByCharacteristicsCompleted += value;
        }
        [MethodImpl(MethodImplOptions.Synchronized)]
        remove
        {
            _findProductsByCharacteristicsCompleted -= value;
        }
    }
然后,我将检查事件值是否为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));
    }

您的事件实现看起来像是一个无休止的递归。您正在其实现中使用属性本身。
将其更改为:

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之后但在您实际引发事件之前从事件中分离了最后一个处理程序,您也不会得到异常,因为您正在对未更改的局部变量进行操作。

为什么您觉得需要检查事件是否为null?因为您不需要基于代码执行此操作,所以它不能为null。当然,如果您订阅了该事件。@Ramhound:如果没有人订阅该事件,则该事件为
null
。不检查
null
是一个非常糟糕的主意。@DanielHilgarth-请注意这一点。事件及其处理程序是两个完全不同的东西。我也有一个“提供的”陈述是有原因的。@PeteTheGreek-没有
.NET Framework 2.5
这样的东西,请更新您的问题,以便我们知道您使用的是什么。@Ramhound:“提供的”陈述是没有用的,因为您永远不知道是否有人订阅了,除非你检查null.hmm,否则我仍然会得到FindProductsByCharacteristicsCompleted'只能出现在+=或-=错误的左侧?无法编译它,我在这里遗漏了什么?@PeteTheGreek:我不知道。错误消息会很有帮助;)仍然获得“事件‘FindProductsByCharacteristicsCompleted’只能出现在+=或-=”@PeteTheGreek的左侧:您应该使用我答案中的最新版本代码。