event关键字真的有用吗?

时间:2011-06-06 23:44:58

标签: c# events

public delegate void SecondChangedHandler(
        object clock, 
        TimeInfoEventArgs timeInformation);

    public event SecondChangedHandler SecondChanged;

我根据此article编写了一个时钟。 现在,如果我删除事件关键字,我会得到相同的结果,那么事件真正起作用了什么?

5 个答案:

答案 0 :(得分:12)

它的编译方式不同。它让人无法做到

mySecondChangedHandler.SecondChanged = SomeMethod(...); //overwrite
mySecondChangedHandler.SecondChanged(...); //invoke

但仅

mySecondChangedHandler.SecondChanged += SomeMethod(...);
mySecondChangedHandler.SecondChanged -= SomeMethod(...);

答案 1 :(得分:6)

event关键字会创建一个私有委托字段,以及一对名为add_EventNameremove_EventName的公开event accessors。 (details

这意味着在类中写EventName会返回委托实例,允许您调用或检查事件处理程序。

课外,EventName并不存在;您所能做的只是编写EventName += somethingEventName -= something,编译器会将其转换为对访问者的调用。 (像财产一样)

有关详细信息,请参阅this series of blog posts

答案 2 :(得分:2)

event关键字有两件事

  • 它提供了权限。只有类可以引发事件,但任何外部方法都可以调用原始委托
  • 它提供可用于设计师等的元数据

答案 3 :(得分:1)

event关键字表示只有承载SecondChanged字段的实例上的方法才能调用它。外部尝试将失败。

答案 4 :(得分:1)

event关键字为委托创建一对访问者。这些实际上是两种方法(addremove),当您从事件订阅取消订阅时调用这些方法。

在您的情况下,您正在创建“类似字段的事件”。编译器在幕后制作委托,并允许您订阅和取消订阅它的调用列表。这意味着您拥有委托的所有功能,但是您限制访问权限,以便外部世界可以“处理”事件,但不会引发事件(调用委托)。

但是,您也可以明确地为事件创建自己的访问器,这些可以执行其他操作(尽管通常不建议这样做,除非有充分理由这样做)。