为什么具有自定义访问器的事件不能像默认情况那样直接触发?

时间:2011-08-20 02:58:46

标签: c# events

如果我写下面的代码,

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 + ='或` - ='运算符。

为什么存在像这样奇怪的东西?如果我不能直接发射事件,为什么我会首先使用这样的东西?这是一个错误(我使用单声道)还是故意精致的设计?谁能请教我这背后的理由?提前谢谢。

2 个答案:

答案 0 :(得分:2)

您只能访问声明课程中的活动。在幕后,.NET创建私有实例变量来保存委托。

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

Jon Skeet提供了很好的信息here,了解其原因及其运作方式。

答案 1 :(得分:2)

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