C# 检查事件是否为空
我在Web服务中有此事件:C# 检查事件是否为空,c#,events,null,C#,Events,Null,我在Web服务中有此事件: public event FindProductsByCharacteristicsCompletedEventHandler FindProductsByCharacteristicsCompleted { [MethodImpl(MethodImplOptions.Synchronized)] add { _findProductsByCharacteristicsCompleted
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的左侧:您应该使用我答案中的最新版本代码。