我只是想确保我理解这一点......
.net 中的“事件”只是代表的集合 - 当某个类想要获取“事件”时,它使用“+”运算符和代表将指向的方法(一种观察者)
因此,如果事件发生 => 某个指针将在集合上移动,并将调用在事件注册中定义的方法。
我对这个描述是否正确?是否有可能以某种方式看到“事件”对象的 Microsoft .net 实现?
.Net中没有Event
对象。.Net 中的事件都是基于MulticastDelegate
s 的(并且 .Net 中的每个委托都是 a MulticastDelegate
)。
如果您有两个相同类型的委托,则可以使用+
运算符将它们组合起来,这不是特定于事件的。
实现的方式MulticastDelegate
是它有一个调用列表,其中包含调用此委托时将调用的简单委托。GetInvocationList()
您可以通过调用该委托来查看它。
您可以尝试查看 的实现MulticastDelegate
,或者说,EventHandler
在像 Reflector 这样的反编译器中,但您不会在那里看到太多,它们都是直接在框架中实现的。
如果您想查看处理调用委托的代码所在的框架的源代码,您可以尝试SSCLI,或者您可以尝试查看mono 的源代码(但这不会向您显示 MS 实现)。
一个事件实际上是一个单一的委托。代表实际上支持多个回调。这不是事件的事情。
事件可以像属性一样使用。属性有一个获取/设置,而事件有一个添加/删除(尽管这通常是自动实现的)。
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 源代码。
我认为Event封装了委托,就像属性和字段的相对关系一样。