一、委托是方法(静态方法、实例方法)的封装,我们把一个方法传递给委托后,该
委托就指向一个具体的方法,在委托中写参数就如同像该方法中写参数,并指向该方
法一样。
二、申明委托编译器会将这行委托代码生成,4个方法:一个构造器、Invoke(和源
代码中指定的原型一样,名称不同,而且是虚方法;参数、返回值和源代码定义一致
)、BeginInvoke、EndInovke(BeginInvoke、EndInovke用于进行异步回调)。
三。所以的委托都有一个构造器,并且该构造器接受2个参数:一个对象引用、一个
指向回调方法的整数。
四。所以的委托都继承自,MulticastDelegate,而MulticastDelegate又继承自
Delegate,Delegate又继承自object。他有3个比较重要的字段:_target(object类
型)、_methodPtr(int32),一个内部的数字(准确说,该字段的类型为System。
IntPtr,其主要用于表示指针或者句柄),clr用他来标识回调方法。、_prev
(MulticastDelegate)指向另一个委托对象,该字段通常为null。
五、比较委托是否相等用Equals,需要比较它们的_traget、 _methodPtr是否相等和
_prev指向链表有相同的长度,如果都匹配返回true;即使是指向相同回调目标/回调
方法的委托对象,即使它们引用的是不同的2个对象,但它们在内部却都引用着相同
的回调目标/回调方法,所以返回true。
六、委托Delegate类中定义了3个静态的方法来帮助我们操作委托链表,2个Combine
的重载,一个Remove,它们都是返回值类型为Delegate静态方法。
七、+=调用Delegate.Combine方法,-=嗲用Delegate.Remove方法。