C#委托回调静态方法 和 实例方法有什么区别?

首先,我们知道静态方法可以通过类名来访问而无需任何实例对象,当然在静态方法中也就不能访问类型中任何非静态成员。相反,实例方法则需要通过具体的实例对象来调用,可以访问实例对象中的任何成员。

其次,当一个实例方法被调用时,需要通过实例对象来访问,因此可以想象当绑定一个实例方法到委托时必须同时让委托得到实例方法的代码段和实例对象的信息,这样在委托被回调的时候.NET才能成功地执行该实例方法。.

下图展示了委托内部的主要结构:

C#委托回调静态方法 和 实例方法有什么区别?

① _target是一个指向目标实例的引用,当绑定一个实例方法给委托时,该参数会作为一个指针指向该方法所在类型的一个实例对象。相反,当绑定一个静态方法时,该参数则被设置为null。

② _methodPtr则是一个指向绑定方法代码段的指针,这一点和C++的函数指针几乎一致。绑定静态方法或实例方法在这个成员的设置上并没有什么不同。

System.MulticastDelegate 在内部结构上相较System.Delegate增加了一个重要的成员变量:_prev,它用于指向委托链中的下一个委托,这也是实现多播委托的基石。

C#委托回调静态方法 和 实例方法有什么区别?