为什么使用自定义访问器的事件不能像默认访问器那样直接触发
本文关键字:访问 默认 接触 事件 自定义 为什么 不能 | 更新日期: 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)
。如果您考虑一下,自定义添加/删除可以将委托存储在任何地方,这就是为什么您不能按照编写的方式检索和调用它们…