event关键字的真正作用是什么

本文关键字:作用 是什么 关键字 event | 更新日期: 2023-09-27 17:58:27

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

我根据这篇文章写了一个时钟。现在,如果我删除event关键字,我会得到相同的结果,那么event到底做了什么?

event关键字的真正作用是什么

它的编译方式不同。它让人无法进行

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

但只有

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

event关键字创建一个私有委托字段,以及一对名为add_EventNameremove_EventName的公共事件访问器。(详细信息(

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

在类之外,EventName并不真正存在;您所能做的就是编写EventName += somethingEventName -= something,编译器会将其转换为对访问器的调用。(像一处房产(

有关更多详细信息,请参阅本系列博客文章。

event关键字做两件事

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

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

event关键字为委托创建一对访问器。这实际上是两种方法(addremove(,当订阅取消订阅

在您的案例中,您正在创建一个"类似字段的事件"。编译器在后台进行委托,并允许您订阅和取消订阅它的调用列表。这意味着您拥有委托的所有功能,但您正在限制访问,以便外部世界可以"处理"事件,但不能引发事件(调用委托(。

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

引用C#语言中关于关键字event

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