我只是想确定我理解这一点......
.net中的'Event'只是委托的集合 - 当某个类想要获取'Event'时,它使用'+'运算符和委托指向的方法(观察者的种类)< / p>
所以,如果事件发生=>一些指针将在集合上行走,并将调用在事件注册中定义的方法。
我对这个描述是对的吗? 是否有可能以某种方式看到'Event'对象的Microsoft .net实现?
答案 0 :(得分:5)
.Net中没有Event
个对象。 .Net中的事件都基于MulticastDelegate
s(.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)
我认为事件封装了委托,就像属性的相对而言 字段。