在.NET中,“Event”对象是如何实现的?

3
我只是想确保我理解了这个...
在.NET中,“事件”只是委托的集合-当某个类想要获取“事件”时,它使用“+”运算符与委托将指向的方法(一种观察者)结合在一起。
因此,如果事件发生 => 指针将在集合上移动,并调用在事件注册中定义的方法。
我的描述正确吗? 是否可能以某种方式查看Microsoft .net实现的“事件”对象?

关于您的最后一个问题:请参考引用源中的 MultiCastDelegate:http://referencesource.microsoft.com/ - Michael Edenfield
3个回答

5
在 .Net 中没有 Event 对象。在 .Net 中,事件都基于MulticastDelegate(而且 .Net 中的每个委托都是 MulticastDelegate)。
如果你有两个相同类型的委托,你可以使用 + 运算符将它们组合起来,这不是特定于事件的。 MulticastDelegate 的实现方式是它有一个调用列表,其中包含将在调用此委托时调用的简单委托。你可以通过在该委托上调用 GetInvocationList() 来查看它。
你可以尝试查看 MulticastDelegate 或者像 Reflector 这样的反编译器中的 EventHandler 的实现,但你不会看到很多东西,因为它们都是直接在框架中实现的。

如果你想查看处理委托调用的代码所在的框架的源代码,可以尝试 SSCLI,或者可以尝试查看 mono的源代码(但这不会显示MS的实现)。


为什么没有人记得微软几年前开始发布.NET源代码?在VS2010中,您可以逐步进入其中。 - Michael Edenfield
2
是的,它的托管部分;MultiCastDelegate位于“RefSrc \ Source \ .Net \ 4.0 \ DEVDIV_TFS \ Dev10 \ Releases \ RTMRel \ ndp \ clr \ src \ BCL \ System”中。 - Michael Edenfield

3

事件实际上是一个单一的委托。委托可以支持多个回调函数,这不是事件特有的。

事件可以像属性一样经常使用。与属性具有get/set不同,事件具有add/remove(尽管通常情况下这是自动实现的)。

private EventHandler<EventArgs> myEvent;

public event EventHandler<EventArgs> MyEvent
{
    add
    {
        myEvent = (EventHandler<EventArgs>)Delegate.Combine(myEvent, value);
    }
    remove
    {
        myEvent = (EventHandler<EventArgs>)Delegate.Remove(myEvent, value);
    }
}

当事件被触发时,基本上是调用委托。没有太多的魔法。

我希望这可以帮到你。我认为你不会找到调用事件的实现方式,因为这是内置在CLR中的。有人提到你可以查看Mono源代码。


在 .net 中,事件是一对方法,称为“Add”和“Remove”,两者都接受相同类型的委托(事件还包括第三个残留方法)。虽然通常情况下 AddRemove 方法使用 MulticastDelegate 派生类来跟踪事件订阅列表,但并不要求它们这样做。 - supercat

1

我认为事件封装了委托,就像属性和字段的关系一样。


2
那怎么回答问题呢? - svick

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