为什么我们不能使用自定义实现来触发事件,而在没有它们的情况下是可能的呢?请看以下代码:
public class Program
{
private EventHandler myEvent;
public event EventHandler MyEvent
{
add { myEvent += value; }
remove { myEvent -= value; }
}
public event EventHandler AnotherEvent;
public static void Main()
{
var target = new Program();
target.MyEvent(null, null); // ERROR CS0079
target.AnotherEvent(null, null); // compiles
}
}
你看到两个事件都在我的类中声明。虽然
target.AnotherEvent(...)
可以编译通过,但target.MyEvent(...)
不能:
事件MyEvent只能出现在+=或-=的左侧。
我知道事件只是一个带有添加和删除方法的委托。因此,编译器将AnotherEvent
转换为添加和删除方法:
private EventHandler _AnotherEvent;
public event EventHandler AnotherEvent
{
add { _AnotherEvent += value; }
remove { _AnotherEvent -= value; }
}
我认为编译器将对
AnotherEvent
的调用替换为对私有委托_AnotherEvent(...)
的调用。
关于第二个调用成功而第一个调用失败的原因是否有相关文档?或者针对编译器在这里所做的工作是否有任何描述?
myEvent
协同工作。我猜是因为MyEvent
是真正事件的门面模式。 - Patrick HofmanmyEvent
中可以工作。而且我已经猜到了这一点。 - MakePeaceGreatAgainadd/remove
与get/set
不同,它被翻译为void AddToInvocationList(delegate...);
和void RemoveFromInvocationList(...);
,因此内部的EventHandler
字段不会暴露给类的使用者。 - René Vogt