如何在.NET中实现“事件”对象?

时间:2012-05-11 01:03:47

标签: c# .net events

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

.net中的'Event'只是委托的集合 - 当某个类想要获取'Event'时,它使用'+'运算符和委托指向的方法(观察者的种类)< / p>

所以,如果事件发生=>一些指针将在集合上行走,并将调用在事件注册中定义的方法。

我对这个描述是对的吗? 是否有可能以某种方式看到'Event'对象的Microsoft .net实现?

3 个答案:

答案 0 :(得分:5)

.Net中没有Event个对象。 .Net中的事件都基于MulticastDelegates(.Net中的每个代表都是MulticastDelegate)。

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

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

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

如果您想查看框架的源代码,其中处理调用代理的代码存在,您可以尝试SSCLI,或者您可以尝试查看the source code of mono(但不会向您展示MS实现。)

答案 1 :(得分:3)

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

事件可以像属性一样使用。虽然属性具有get / set,但事件具有添加/删除(尽管通常会自动实现)。

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来源。

答案 2 :(得分:1)

我认为事件封装了委托,就像属性的相对而言 字段。