【问题标题】:Does the CLR know anything about Events?CLR 是否知道有关事件的任何信息?
【发布时间】:2014-06-22 16:30:25
【问题描述】:

在我看来,事件是对 CLR 的 .NET 操作。也就是说,IL 中没有“事件”概念或命令,编程语言(如 C#)利用委托来实现事件(只是对象)的行为,从 CLR 的角度来看查看没有事件,只是一个常规的委托机制。 这是真的吗,还是 CLR 对事件有一些特殊处理?

【问题讨论】:

    标签: .net events delegates clr il


    【解决方案1】:

    CLR 当然对事件有意识。它们存在于程序集的元数据中,CLR 中内置的反射支持会公开它们。它的调试器接口向调试器公开事件信息。 [ComVisible] C# 声明中声明的事件到 COM 事件接收器接口的映射由 CLR 内置的 CLR 互操作支持负责。

    但这也许都可以被认为只是基础设施支持。海龟一路向下,CLR 不直接参与订阅和触发事件,只是委托。这很重要,它需要快速。否则 CLR 的核心行为,只有在绝对必要时才会参与。

    【讨论】:

      【解决方案2】:

      你完全正确。

      事件只是名为add_EventNameremove_EventName 的一对方法。

      对它们的唯一 CLR 意识是存在用于反射的 EventInfo 类,以及支持它的元数据(特别是对这些方法和属性的引用)。

      【讨论】:

      • “事件是 CLR 上的 .NET 操作”完全正确吗?我会,呃,说这更像是一个编译器的东西,而不是运行时的操作......也许一个如何重写事件的例子可能更能说明 OP?
      • @Will:我指的是他的第二句话。
      【解决方案3】:

      事件被 CLR 理解。它们作为元数据存在于已编译的程序集中。

      一个事件包含一对名为add_EventNameremove_EventName 的方法。从实现的角度来看,这些方法的调用方式与任何其他方法一样。没有用于附加到事件的 IL 指令。

      因此,事件获得的唯一特殊处理是元数据,以方便开发人员。

      【讨论】:

        猜你喜欢
        • 2020-06-12
        • 1970-01-01
        • 2017-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-12
        • 1970-01-01
        相关资源
        最近更新 更多