При компиляции кодpublic event EventHandler<EventArgs> someEvent;
преобразуется к видуprivate EventHandler<EventArgs> someEvent = null;
[MethodImpl(MethodImplOptions.Synchronized)]
public void add_someEvent(EventHandler<EventArgs> value){
someEvent = (EventHandler<EventArgs>)Delegate.Combine(someEvent, value);
}
[MethodImpl(MethodImplOptions.Synchronized)]
public void remove_someEvent(EventHandler<EventArgs> value){
someEvent = (EventHandler<EventArgs>)Delegate.Remove(someEvent, value);
Теперь посмотрим на код метода remove (после проверок вызывается метод RemoveImpl).method family hidebysig newslot virtual instance class System.Delegate RemoveImpl(class System.Delegate d) cil managed
{
.maxstack 8
L_0000: ldarg.1
L_0001: ldarg.0
L_0002: callvirt instance bool System.Object::Equals(object)
L_0007: brtrue.s L_000b
L_0009: ldarg.0
L_000a: ret
L_000b: ldnull
L_000c: ret
}
В нашем случае данный метод вернет null.
Фактически перемеменная temp (после temp = someEvent) будет указывать на делегат.
После метода remove_someEvent, someEvent присваивается null, а temp все так же указывает на делегат
Mastering .NET doesn`t make you a geek. It makes you a geek worthy of a raise. (с) Jeffrey Richter
Данное сообщение получено с сайта GotDotNet.RU
Последний раз редактировалось 27 December 2007 22:44
|