委托揭秘
2009-06-10 08:32:08 来源:WEB开发网重要提示: System.MulticastDelegate 类继承自 system.Delegate,后者本身继承自System.Object。之所以有两个委托类,是有历史原因的,同时也是很遗憾的,FCL中本应只有一个委托类。没有办法,我们需要了解这两个类,因为即使构建的所有委托类型都把MulticastDelegate作为基类,我们仍然会在个别情况下用Delegate类(而不是MulticastDelegate类)定义的方法来处理自己构建的这些委托类型。例如,Delegate 类有两个静态方法,分别名为 Combine 和 Remove 。这两个方法的前面指出它们要取 Delegate 参数。因为委托类型继承自 MulticastDelegate,后者又继承自 Delegate,所以委托类型的实例可以被传入这二个方法。
委托类有Public可见性,因为委托在源代码中被声明为Public类。我们应该知道,委托类可以在一个类型内部(即嵌套在另一个类型内)或在全局范围内定义。简单地说,因为委托是类,在可以定义类的任何地方,都可以定义委托。
因为所有委托类型都继承 MulticastDelegate,所以它们都继承了 MulticastDelegate 的字段、属性和方法。在所有这些成员中,有3个非公共字段是最重要的。
字段:_target
类型:System.Object
描述:当委托对象封装一个静态方法时,这个字段为 null。当委托对象封装一个实例方法时,这个字段引用的是调用回调方法是要操作的对象。换而言之,这个字段指名要传给实例方法的隐式 this 参数的值。
字段:_methodPtr
类型:System.IntPtr
描述:一个内部的整数值,CLR用它标识要回调的方法。
字段:_invocationList
类型:System.Object
描述:该字段通常为null。在构建一个委托链时,它可以引用一个委托数组。
更多精彩
赞助商链接