【问题标题】:What does the event keyword really do?event 关键字的真正作用是什么?
【发布时间】:2011-09-09 16:45:00
【问题描述】:
public delegate void SecondChangedHandler(
        object clock, 
        TimeInfoEventArgs timeInformation);

    public event SecondChangedHandler SecondChanged;

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

【问题讨论】:

    标签: c# events


    【解决方案1】:

    引用C# lang reference关于关键字event的内容,

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

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
    【解决方案2】:

    event 关键字创建一个 private 委托字段,以及一对称为 add_EventNameremove_EventName 的公共 event accessors。 (details)

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

    在课堂之外,EventName 并不存在;您所能做的就是编写EventName += somethingEventName -= something,编译器会将其转换为对访问器的调用。 (就像一个属性)

    更多详情请见this series of blog posts

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

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

        但只有

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

        【讨论】:

        • 这真的是我一直在寻找的答案! :D 你是救生员 :)
        • 继续点击答案旁边的复选框以接受它。这使得其他人在搜索时更容易找到解决方案。
        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          event 关键字做了两件事

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

          【讨论】:

            猜你喜欢
            • 2019-07-05
            • 2011-02-08
            • 2016-08-30
            • 2013-02-23
            • 1970-01-01
            • 2021-12-26
            • 2012-11-19
            • 1970-01-01
            • 2014-04-26
            相关资源
            最近更新 更多