事件关键字到底是做什么的?

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

    public event SecondChangedHandler SecondChanged;

我写了一个时钟,基于这篇文章。 现在如果我删除事件关键字,就会得到相同的结果,那么事件真正起到了什么作用呢?

6个回答

16

它编译方式不同。这样可以防止某人进行操作。

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

但仅此而已

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

这真的是我在寻找的答案! :D 你是我的救星 :) - Olle OlssN
请继续点击答案旁边的复选框以接受它。这样可以使其他人在搜索时更容易找到解决方案。 - Joel

6
event关键字创建了一个私有委托字段,并创建了一对公共的事件访问器,分别称为add_EventNameremove_EventName。(详细信息
这意味着在类内部编写EventName将返回委托实例,允许您调用或检查事件处理程序。
在类外部,EventName并不存在。你只能编写EventName += somethingEventName -= something,编译器会将其转换为对访问器的调用。(就像属性一样)
有关更多详细信息,请参见此系列博客文章

2

事件关键字有两个作用:

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

2
< p > event 关键字意味着只有承载 SecondChanged 字段的实例上的方法才能调用它。外部尝试将失败。


1

event 关键字为委托创建了一对 访问器。这实际上是两个方法 (addremove),当你从事件中 订阅取消订阅 时会调用它们。

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

然而,你也可以显式地为事件创建自己的访问器,这些访问器可以做其他事情 (尽管通常不建议这样做,除非有充分的理由)。


-1

C#语言参考引用关于event关键字的说明:

事件是一种特殊的多路广播委托,只能从声明它们的类或结构(发布者类)内部调用。


虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅有链接的答案可能会失效。-【来自审查】 - Andrew Halil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接