C#中的事件触发是否总是受到空检查的保护?

时间:2014-03-13 09:00:14

标签: c# events null-check

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

在C#中,您需要在触发之前检查类中是否有任何侦听器。

假设C#的事件结构是一个非标准(意思是微软做到了)Observer可观察模式的实现,以方便使用。

为什么他们没有在这个结构中实现这个?这个选择是否有充分的理由或文件。

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

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

3 个答案:

答案 0 :(得分:3)

是的,您必须进行null检查。

调用null的委托会产生NullReferenceException

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

答案 1 :(得分:1)

a blog by Eric Gunnerson已回复此问题。

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

换句话说, 是原始设计中的一个错误事件,但修复它已经太晚了。

答案 2 :(得分:0)

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

public Action<object, EventArgs> SomeEvent = (o, e) => { };

以这种方式,您可以在不检查null的情况下调用SomeEvent,因为它包含一个默认(空实现)侦听器。请注意,这可能会影响性能。