public delegate void SecondChangedHandler(
object clock,
TimeInfoEventArgs timeInformation);
public event SecondChangedHandler SecondChanged;
我根据此article编写了一个时钟。 现在,如果我删除事件关键字,我会得到相同的结果,那么事件真正起作用了什么?
答案 0 :(得分:12)
它的编译方式不同。它让人无法做到
mySecondChangedHandler.SecondChanged = SomeMethod(...); //overwrite
mySecondChangedHandler.SecondChanged(...); //invoke
但仅
mySecondChangedHandler.SecondChanged += SomeMethod(...);
mySecondChangedHandler.SecondChanged -= SomeMethod(...);
答案 1 :(得分:6)
event
关键字会创建一个私有委托字段,以及一对名为add_EventName
和remove_EventName
的公开event accessors。 (details)
这意味着在类中写EventName
会返回委托实例,允许您调用或检查事件处理程序。
课外,EventName
并不存在;您所能做的只是编写EventName += something
和EventName -= something
,编译器会将其转换为对访问者的调用。 (像财产一样)
有关详细信息,请参阅this series of blog posts。
答案 2 :(得分:2)
event关键字有两件事
答案 3 :(得分:1)
event
关键字表示只有承载SecondChanged字段的实例上的方法才能调用它。外部尝试将失败。
答案 4 :(得分:1)
event
关键字为委托创建一对访问者。这些实际上是两种方法(add
和remove
),当您从事件订阅或取消订阅时调用这些方法。
在您的情况下,您正在创建“类似字段的事件”。编译器在幕后制作委托,并允许您订阅和取消订阅它的调用列表。这意味着您拥有委托的所有功能,但是您限制访问权限,以便外部世界可以“处理”事件,但不会引发事件(调用委托)。
但是,您也可以明确地为事件创建自己的访问器,这些可以执行其他操作(尽管通常不建议这样做,除非有充分理由这样做)。