public delegate void SecondChangedHandler(
object clock,
TimeInfoEventArgs timeInformation);
public event SecondChangedHandler SecondChanged;
我写了一个时钟,基于这篇文章。 现在如果我删除事件关键字,就会得到相同的结果,那么事件真正起到了什么作用呢?
它编译方式不同。这样可以防止某人进行操作。
mySecondChangedHandler.SecondChanged = SomeMethod(...); //overwrite
mySecondChangedHandler.SecondChanged(...); //invoke
但仅此而已
mySecondChangedHandler.SecondChanged += SomeMethod(...);
mySecondChangedHandler.SecondChanged -= SomeMethod(...);
事件关键字有两个作用:
event
关键字意味着只有承载 SecondChanged 字段的实例上的方法才能调用它。外部尝试将失败。
event
关键字为委托创建了一对 访问器。这实际上是两个方法 (add
和 remove
),当你从事件中 订阅 或 取消订阅 时会调用它们。
在你的情况下,你正在创建一个 "类似字段的事件"。编译器在幕后创建了一个委托,并允许你订阅和取消订阅它的调用列表。这意味着你拥有委托的所有功能,但限制了外部世界可以 "处理" 事件的访问,而不能引发事件 (调用委托)。
然而,你也可以显式地为事件创建自己的访问器,这些访问器可以做其他事情 (尽管通常不建议这样做,除非有充分的理由)。
从C#语言参考引用关于event
关键字的说明:
事件是一种特殊的多路广播委托,只能从声明它们的类或结构(发布者类)内部调用。