【发布时间】:2014-06-22 16:30:25
【问题描述】:
在我看来,事件是对 CLR 的 .NET 操作。也就是说,IL 中没有“事件”概念或命令,编程语言(如 C#)利用委托来实现事件(只是对象)的行为,从 CLR 的角度来看查看没有事件,只是一个常规的委托机制。 这是真的吗,还是 CLR 对事件有一些特殊处理?
【问题讨论】:
标签: .net events delegates clr il
在我看来,事件是对 CLR 的 .NET 操作。也就是说,IL 中没有“事件”概念或命令,编程语言(如 C#)利用委托来实现事件(只是对象)的行为,从 CLR 的角度来看查看没有事件,只是一个常规的委托机制。 这是真的吗,还是 CLR 对事件有一些特殊处理?
【问题讨论】:
标签: .net events delegates clr il
CLR 当然对事件有意识。它们存在于程序集的元数据中,CLR 中内置的反射支持会公开它们。它的调试器接口向调试器公开事件信息。 [ComVisible] C# 声明中声明的事件到 COM 事件接收器接口的映射由 CLR 内置的 CLR 互操作支持负责。
但这也许都可以被认为只是基础设施支持。海龟一路向下,CLR 不直接参与订阅和触发事件,只是委托。这很重要,它需要快速。否则 CLR 的核心行为,只有在绝对必要时才会参与。
【讨论】:
你完全正确。
事件只是名为add_EventName 和remove_EventName 的一对方法。
对它们的唯一 CLR 意识是存在用于反射的 EventInfo 类,以及支持它的元数据(特别是对这些方法和属性的引用)。
【讨论】:
事件被 CLR 理解。它们作为元数据存在于已编译的程序集中。
一个事件包含一对名为add_EventName 和remove_EventName 的方法。从实现的角度来看,这些方法的调用方式与任何其他方法一样。没有用于附加到事件的 IL 指令。
因此,事件获得的唯一特殊处理是元数据,以方便开发人员。
【讨论】: