委托 CLR学习第十五课 狼

一、委托是方法(静态方法、实例方法)的封装,我们把一个方法传递给委托后,该

委托就指向一个具体的方法,在委托中写参数就如同像该方法中写参数,并指向该方

法一样。

二、申明委托编译器会将这行委托代码生成,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方法。

原文地址:https://www.cnblogs.com/gowhy/p/2015989.html