目录
代码如下,很简单
运行的结果
反编译程序查看
关注两点:
什么是委托
委托的三个步骤
委托的意义
代码如下,很简单
namespace Delegate
{
class Program
{
delegate void SayHi();
void SayHi_1()
{
Console.WriteLine("SayHi_1");
}
static void Main(string[] args)
{
Program p = new Program();
SayHi sh = new SayHi(p.SayHi_1);
sh.Invoke();
Console.Read();
}
}
}
namespace Delegate
{
class Program
{
delegate void SayHi();
void SayHi_1()
{
Console.WriteLine("SayHi_1");
}
static void Main(string[] args)
{
Program p = new Program();
SayHi sh = new SayHi(p.SayHi_1);
sh.Invoke();
Console.Read();
}
}
}
运行的结果
反编译程序查看
关注两点:
1、委托反编译过后是一个类。
2、有一个Invoke方法。
我们对类应该玩的非常熟练了吧,一般套路 :用类new 实例对象——>调用方法。
委托也一样
SayHi sh = new SayHi(p.SayHi_1);//new 实例对象
sh.Invoke();//调用方法
什么是委托
IL层面
1、委托的本质就是一个类
2、继承自System.MulticastDelegate
3、委托里面内置了3个方法:Invoke(),BeginInvoke(),EndInvoke()。
委托的三个步骤
1、delegate void SayHi();//1.委托的声明
2、SayHi sh = new SayHi(p.SayHi_1)//2.委托的实例化(构造函数传方法)
3、sh.Invoke();//3.实例调用(Invok调用),这里等于执行了这个方法
sh ();//直接调用和上面一行代码是一样的
委托的意义
1、解耦:
好处是减少重复代码;
解耦是解除了判断逻辑和共用逻辑之间的耦合;
委托传递的是逻辑(逻辑就是方法);
2、异步多线程
3、多播委托
+=为委托实例按顺序增加方法,形成方法链,Invok()时按顺序执行
-=为委托实例移除方法,从方法链的尾部开始匹配,遇到第一个完全吻合的移除,且只移除一个;没有的也不异常
多播委托带返回值,结果以最后的为准
价值:一个变量保存多个方法,可以增减方法;Invok时候可顺序执行