代码之前的一些文本,以便问题摘要不会被破坏.
class Tree { public event EventHandler MadeSound; public void Fall() { MadeSound(this, new EventArgs()); } static void Main(string[] args) { Tree oaky = new Tree(); oaky.Fall(); } }
我没有在C#中使用过很多事件,但这会导致NullRefEx的事实看起来很奇怪.EventHandler引用被认为是null,因为它当前没有subribers - 但这并不意味着事件没有发生,是吗?
EventHandlers通过event关键字与标准委托区分开来.语言设计师为什么没有设置它们在没有订阅者的情况下默默地射入虚空?(我收集你可以通过显式添加一个空委托手动完成此操作).
那么,规范形式是:
void OnMadeSound() { if (MadeSound != null) { MadeSound(this, new EventArgs()); } } public void Fall() { OnMadeSound(); }
这是非常轻微快,调用一个空的代表,所以速度战胜了编程方便.