为什么使用自定义访问器的事件不能像默认访问器那样直接触发

本文关键字:访问 默认 接触 事件 自定义 为什么 不能 | 更新日期: 2023-09-27 18:06:23

如果我写下面的代码,

class MainClass
{
    static EventHandler _myEvent= delegate{};
    static event EventHandler MyEvent
    {
        add{_myEvent += value;}
        remove{_myEvent -= value;}
    }
    public static void Main (string[] args)
    {
        MyEvent(null,EventArgs.Empty);
    }
}

编译器会报错:错误CS0079:事件MainClass.MyEvent' can only appear on the left hand side of +='或' -='操作符。

为什么会有这么奇怪的东西存在?如果我不能直接触发事件,为什么我要在一开始就使用这样的东西呢?这是一个bug(我使用的是单声道)还是精心设计的?有人能告诉我这背后的原理吗?

为什么使用自定义访问器的事件不能像默认访问器那样直接触发

您只能访问声明类中的事件。在幕后,. net创建私有实例变量来保存委托。

编译器实际上创建了一个公共事件和一个私有字段。您可以直接从同一个类或嵌套类访问该字段。在外部类中,只允许订阅/退订。

Jon Skeet在这里提供了很多关于为什么会这样以及它是如何工作的信息。

您需要调用手动声明的支持委托来引发事件:将MyEvent(null, EventArgs.Empty)替换为_myEvent(null, EventArgs.Empty)。如果您考虑一下,自定义添加/删除可以将委托存储在任何地方,这就是为什么您不能按照编写的方式检索和调用它们…