C#中的事件触发是否应始终通过空检查进行保护?

C#中的事件触发是否应始终通过空检查进行保护?,c#,events,null-check,C#,Events,Null Check,这种情况对我来说似乎很有趣 在C#中,在启动类之前,需要检查类中是否有该事件的侦听器 假设C#的事件结构是Observer observable模式的非标准(意味着微软做到了)实现,以便于使用 为什么他们不在这个结构中实现这个呢?对于这种选择是否有充分的理由或文件 是否有必要进行空检查,或者我对所有情况下都需要空检查的事件结构的假设是错误的。 这是一个更为好奇的问题,它在寻找微软对这一实现选择的答案。我希望这将进一步了解委托和事件关键字的内部工作。是的,您必须执行null检查 调用null的委托

这种情况对我来说似乎很有趣

在C#中,在启动类之前,需要检查类中是否有该事件的侦听器

假设C#的事件结构是Observer observable模式的非标准(意味着微软做到了)实现,以便于使用

为什么他们不在这个结构中实现这个呢?对于这种选择是否有充分的理由或文件

是否有必要进行空检查,或者我对所有情况下都需要空检查的事件结构的假设是错误的。


这是一个更为好奇的问题,它在寻找微软对这一实现选择的答案。我希望这将进一步了解委托和事件关键字的内部工作。

是的,您必须执行
null
检查

调用
null
的委托会导致
NullReferenceException


您可能会尝试使用非null、空的事件处理程序初始化所有委托。但是,就CPU使用率、内存使用率和代码行而言,这比测试
null
要糟糕得多。

是的,您必须执行
null
检查

调用
null
的委托会导致
NullReferenceException


您可能会尝试使用非null、空的事件处理程序初始化所有委托。但是,就CPU使用率、内存使用率和代码行而言,这比测试
null
要糟糕得多。

您可以添加默认事件侦听器,从而避免null检查

public Action<object, EventArgs> SomeEvent = (o, e) => { };
公共行动SomeEvent=(o,e)=>{};
通过这种方式,您可以调用SomeEvent而不检查null,因为它包含一个默认(空实现)侦听器。请注意,这可能会影响性能。

您可以添加默认事件侦听器,从而避免空检查

public Action<object, EventArgs> SomeEvent = (o, e) => { };
公共行动SomeEvent=(o,e)=>{};
通过这种方式,您可以调用SomeEvent而不检查null,因为它包含一个默认(空实现)侦听器。请注意,这可能会影响性能。

中有对该问题的答复

基本上,它似乎说微软考虑过改变它,但它会破坏现有的代码


换句话说,在最初的事件设计中,这是一个错误,但现在修复它为时已晚。

中有对这个问题的回答

基本上,它似乎说微软考虑过改变它,但它会破坏现有的代码



换句话说,在最初的事件设计中这是一个错误,但现在修复它已经太迟了。

像用户界面控件这样的东西通常有很多事件,但很少有观察者。为什么我们需要给这些未使用的事件一些特殊的非空值?请看,这也是避免检查空值的一个好方法。调用事件不会隐式检查空值,这是Microsoft的一个愚蠢错误。事件不需要一些特殊值。事件是一个关键字,编译器会创建一个列表来保存要调用的委托。我想知道为什么微软没有对这个概念进行进一步的改进?询问是否有关于这个选择的文档或解释。对这个问题的回答基本上是说他们考虑过改变它,但它可能会破坏现有的代码。无论如何,@codesincosis似乎是正确的像用户界面控件这样的东西通常有很多事件,但很少有观察者。为什么我们需要给这些未使用的事件一些特殊的非空值?请看,这也是避免检查空值的一个好方法。调用事件不会隐式检查空值,这是Microsoft的一个愚蠢错误。事件不需要一些特殊值。事件是一个关键字,编译器会创建一个列表来保存要调用的委托。我想知道为什么微软没有对这个概念进行进一步的改进?询问是否有关于这个选择的文档或解释。对这个问题的回答基本上是说他们考虑过改变它,但它可能会破坏现有的代码。无论如何,@codesincosis似乎是正确的我完全同意你的回答。它基本上是检查函数指针是否指向某个对象。但是当我们将其用作事件时,在event关键字后面有一个初始化的委托列表?你觉得这个怎么样。它是否能够在由事件关键字创建的代码后面实现这种列表管理。@AliAkdurak有关详细信息,请阅读此问题的所有答案和注释:我将检查链接的问题和答案。您提供的此链接提供了这种空值检查的详细实现基准和方法。我非常同意你的回答。它基本上是检查函数指针是否指向某个对象。但是当我们将其用作事件时,在event关键字后面有一个初始化的委托列表?你觉得这个怎么样。它是否能够在由事件关键字创建的代码后面实现这种列表管理。@AliAkdurak有关详细信息,请阅读此问题的所有答案和注释:我将检查链接的问题和答案。您提供的此链接提供了这种空值检查的详细实现基准和方法。这是一个很好的参考。你可以,但我不应该。你可以,但在我看来,你不应该。请参阅更长的讨论。我认为这篇博客文章从if null检查中提出了关于竞争条件的更重要的问题,因为线程可以检查委托,然后进入if块并获得中断。而另一个线程将注销所有委托。这让我相信它是完全不安全的。@AliAkdurak是的,我总是复制处理程序,检查副本是否为空,并调用副本而不是原始副本,正是出于这个原因。有趣的是,这个