为什么必须有人订阅事件发生?

xyz*_*xyz 12 c# events

代码之前的一些文本,以便问题摘要不会被破坏.

class Tree
{
    public event EventHandler MadeSound;

    public void Fall() { MadeSound(this, new EventArgs()); }

    static void Main(string[] args)
    {
        Tree oaky = new Tree();
        oaky.Fall();
    }
}
Run Code Online (Sandbox Code Playgroud)

我没有在C#中使用过很多事件,但这会导致NullRefEx的事实看起来很奇怪.EventHandler引用被认为是null,因为它当前没有subribers - 但这并不意味着事件没有发生,是吗?

EventHandlers通过event关键字与标准委托区分开来.语言设计师为什么没有设置它们在没有订阅者的情况下默默地射入虚空?(我收集你可以通过显式添加一个空委托手动完成此操作).

Jam*_*ran 6

那么,规范形式是:

void OnMadeSound()
{
    if (MadeSound != null)
    {
        MadeSound(this, new EventArgs());
    }
}

public void Fall() {  OnMadeSound(); }
Run Code Online (Sandbox Code Playgroud)

这是非常轻微快,调用一个空的代表,所以速度战胜了编程方便.


Jon*_*eet 3

您需要了解您的事件声明实际上在做什么。它声明了一个事件和一个变量,当您在类中引用它时,您只是引用该变量,当没有订阅者时该变量将为 null。