详解详解c# 委托链委托链
引言:引言:
上一专题介绍了下编译器是如何来翻译委托的,从中间语言的角度去看委托,希望可以帮助大家进一步的理解委托,然而之前
的介绍都是委托只是封装一个方法,那委托能不能封装多个方法呢?因为生活中经常会听到,我代表大家的意见等这样的说
话,既然委托也是一个代表,那他如果只能代表一个人,那他的魅力就不是很大了吧,所以我们就会委托能不能代表多个方法
的? 答案是可以的,这就是本专题要讲的内容——委托链,委托链也是一个委托,只是因为它是把多个委托链在一起,所以
我们就以委托链来这么称呼它的。
一、到底什么是委托链一、到底什么是委托链
我们平常实例化委托对象时都是绑定一个方法的, 前一个专题介绍的委托也是包装了一个方法的, 用前面的例子就是委派律
师的只有一个人,也就是当事人只有一个的,但是现实生活中显然不是这样的,在官司的时候律师可以同时接多个案子,也是
接收多个当时人的委派,这样,该律师就与多个当事人绑定在一起了, 需要了解多个当事人的案件情况的。其实这就是生活
中的委托链,此时这位律师不仅仅是一个人的代表律师了,而是多个当事人的律师。生活中的委托链和C#中的委托链很类似
的,现在就说说C#中的委托链到底是个什么的?
首先委托链就是一个委托,所以大家不要看到委托链感觉又是什么C#中的新特性的,然而要把多个委托链在一起,就必须存
储多个委托的引用,那委托链对象是在哪里存储多个委托的引用的呢?还记得我们上一专题中,我们介绍的委托类型有三个非
公共字段的吗?这三个字段是——_target,methodPtr 和_invocationList,至于这三个字段具体代表什么大家可以查看我的上一
专题的文章,然而_invocationList 字段正是存储多个委托引用的地方的。
为了更好的解释_invocationList是如何来存储委托引用的,下面先看一个委托链的例子和运行结果,然后再分析原因:
using System;
namespace DelegateTest
{
public class Program
{
// 声明一个委托类型,它的实例引用一个方法
// 该方法回去一个int 参数,返回void类型
public delegate void DelegateTest(int parm);
public static void Main(string[] args)
{
// 用静态方法来实例化委托
DelegateTest dtstatic = new DelegateTest(Program.method1);
// 用实例方法来实例化委托
DelegateTest dtinstance = new DelegateTest(new Program().method2);
// 隐式调用委托
dtstatic(1);
// 显式调用Invoke方法来调用委托
dtinstance.Invoke(1);
// 隐式调用委托
dtstatic(2);
// 显式调用Invoke方法来调用委托
dtinstance.Invoke(2);
Console.Read();
}
private static void method1(int parm)
{
Console.WriteLine("调用的是静态方法,参数值为:" + parm);
}
private void method2(int parm)
{
Console.WriteLine("调用的是实例方法,参数值为:" + parm);
}
}
}