委托在本质上是一个类,我们用delegate关键字声明的所有委托都继承自System.MulticastDelegate。后者又继承自System.Delegate类,System.Delegate类则继承自System.Object。委托既然是一个类,那么它可以被定义在任何地方,既可以定义在类的内部,也可以定义在类的外部。
正如很多资料上所说的,委托是一种类型安全的函数回调机制,它不仅能够调用实例方法,也能调用静态方法,并且具备按顺序执行多个方法的能力。
由于委托继承自System.MulticastDelegate类,自然也继承MulticastDelegate类的字段、属性和方法。这些成员中,最重要的当属三个非公共字段。如下所示:
字段名称 字段类型 描叙
_target System.Object 该字段指明委托所调用的方法所在的实例类型。如果委托调用的为静态方法,该字段为null;如果为实例方法则为该方法所在的对象。
_methodPtr System.InPtr 标识回调方法的指针
_invocationList System.Object 在创建委托链时指向一个委托数组,在委托刚刚构建时通常为null
编译器自动为委托创建了BeginInvoke,Invoke和EndInvoke三个方法。
当我们在像用普通的方法一样调用委托时,这时实际上调用的是编译器自动生成的Invoke方法。