3

我只是想确保我理解这一点......

.net 中的“事件”只是代表的集合 - 当某个类想要获取“事件”时,它使用“+”运算符和代表将指向的方法(一种观察者)

因此,如果事件发生 => 某个指针将在集合上移动,并将调用在事件注册中定义的方法。

我对这个描述是否正确?是否有可能以某种方式看到“事件”对象的 Microsoft .net 实现?

4

3 回答 3

5

.Net中没有Event对象。.Net 中的事件都是基于MulticastDelegates 的(并且 .Net 中的每个委托都是 a MulticastDelegate)。

如果您有两个相同类型的委托,则可以使用+运算符将​​它们组合起来,这不是特定于事件的。

实现的方式MulticastDelegate是它有一个调用列表,其中包含调用此委托时将调用的简单委托。GetInvocationList()您可以通过调用该委托来查看它。

您可以尝试查看 的实现MulticastDelegate,或者说,EventHandler在像 Reflector 这样的反编译器中,但您不会在那里看到太多,它们都是直接在框架中实现的。

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

于 2012-05-11T01:14:48.493 回答
3

一个事件实际上是一个单一的委托。代表实际上支持多个回调。这不是事件的事情。

事件可以像属性一样使用。属性有一个获取/设置,而事件有一个添加/删除(尽管这通常是自动实现的)。

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 源代码。

于 2012-05-11T01:18:16.537 回答
1

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

于 2012-05-11T01:13:28.843 回答