分析问题
在开始分析委托内部构造之前,先来回顾一下最基本的概念,在C#中,静态方法和实例方法分别指什么,两者有什么区别。和其他大部分面向对象的高级语言相同,在C#中静态方法由关键字static来定义,静态方法可以通过类名来访问而不需要任何实例对象,相应的,在静态方法中不能访问类型中任何非静态成员。而实例方法需要通过具体的实例对象来调用,可访问实例对象中的任何成员。
现在来研究一下委托绑定实例方法和静态方法的区别。如上所述,当一个实例方法被调用时,需要通过实例对象来访问,可以想象,绑定一个实例方法到委托必须同时让委托得到实例方法的代码段和实例对象的信息,这样在委托被回调时候.NET才能成功地执行该实例方法。下图展示了委托内部的结构。
_target是一个指向目标实例的引用。当绑定一个实例方法给委托时,该参数会被设置成该方法所在类型的一个实例对象。而当绑定一个静态方法给委托时,该参数则会被设置为null。
_methodPtr是一个指向绑定方法代码段的指针,和C++中的函数指针极其类似。绑定静态方法或实例方法在这个成员的设置上并没有不同。
事实上,对于继承自System.MulticastDelegate的自定义委托类型来说,还有另外一个成员变量:_prev,该指针指向委托链中的下一个委托,关于链式委托的概念在后面的小姐中会有所覆盖。至此,读者已经理解了委托绑定实例方法和静态方法的不同点,那就是_target的成员设置。
答案
当委托绑定静态方法时,内部的对象成员变量_target将会被设置成null,而当委托绑定实例方法时,_target将会设置成指向该实例方法所属类型的一个实例对象,当委托被执行时,该对象实例将被用来调用实例方法。
时间: 2024-10-28 19:12:04