0

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

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

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

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

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

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

4

3 回答 3

3

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

调用null结果为NullReferenceException.

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

于 2014-03-13T09:01:58.283 回答
1

在Eric Gunnerson 的博客中有对这个问题的回复。

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

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

于 2014-03-13T09:34:22.840 回答
0

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

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

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

于 2014-03-13T09:06:46.560 回答