参考资料:深入理解c#
一、概述
委托是什么?相信第一次接触到委托的人肯定会希望能够以最快的方式了解委托,在c#中的委托和现实世界的遗嘱一样,在恰当的时间执行一系列的 操作。委托中定义了一种输入和输出的格式的规范,并且这种规范还能够作为方法的参数将实现该委托的方法的代码传递到该方法中。这句话可能有点绕口,但是我觉得要真的理解起来应该不是很困难。下面我就举例来进行说明。
二、委托调用的步骤
1.委托的声明
委托的关键字为delegate,以如下方式声明委托:
delegate void ZuoCaiDelegate(string st);
该委托没有返回值,入参为string类型的参数.
2.委托所对应的方法
public void ChaoCai(string st)
{
Console.WriteLine("D负责炒菜!" + st);
}
委托与委托所对应的方法的入参和返回值必须保持一致
3.委托实例的创建
ZuoCaiDelegate zuoCaiDelegate = new ZuoCaiDelegate(ChaoCai);
4.委托的调用
public void ShowChaoCai(ZuoCaiDelegate zuoCaiDelegate)
{
zuoCaiDelegate("D是奥巴马!");
}
创建委托实例的时候需要给出 委托对应的 方法,在调用委托的时候传相应的参数,就能够调用委托所关联的方法了,调用结果如下:
三.委托应用的详解
1.现在我们在来看下面 这句话:
委托中定义了一种输入和输出的格式的规范,并且这种规范还能够作为方法的参数将实现该委托的方法的代码传递到该方法中
委托是一种方法的规范,在上面的例子中,委托所对应的方法入参必须是string类型并且没有用返回值,
在第四步ShowChaoCai的方法中传入的委托,等同于将符合委托规范的代码传入到此方法中并且方法可以随时调用这段代码.
2.委托的具体应用
委托的应用非常广泛,特别是在c#的 源码中,几乎处处都能够看到委托的身影.以Task为例.我们可以翻看一下 task的其中 一些 源码
public Task(Action action);
public delegate void Action();
说明task的入参本质是就是一个 委托,我们在这里可以以委托来进行对task的调用.代码如下:
public static void test()
{ Console.WriteLine("测试"); }
...
Action tes = new Action(test);
Task ts = new Task(tes);
ts.Start();
成功将test中的代码传入到了Task中.
委托除了在task中能够调用之外在其他很多地方 都有应用 ,并且它还是lambda表达式和linq的基础,还是非常重要的.
3.扩展
一个委托里面可以同时传入多个相应的方法代码如下(例子中只有一个 方法,但是 这里可以传入不同的方法):
ZuoCaiDelegate zuoCaiDelegatex = new ZuoCaiDelegate(ChaoCai);
zuoCaiDelegatex += ChaoCai;
zuoCaiDelegatex += ChaoCai;
zuoCaiDelegatex += ChaoCai;
zuoCaiDelegatex("D是奥巴马!");
方法的入参必须都是一致的,若有返回值的话委托所得到的返回值为最后一个方法内的返回值.
(这里只是委托的初级用法,后续会对其进行更加深入的分析)
四.委托的测试代码
public class ZuoCai
{
//定义一个做菜的委托
public delegate void ZuoCaiDelegate(string st);
/// 拿菜方法
public void NaCai(string st)
{
Console.WriteLine("A负责拿菜!"+st);
}
/// 切菜方法
public void QieCai(string st)
{
Console.WriteLine("B负责切菜!" + st);
}
/// 配菜方法
public void PeiCai(string st)
{
Console.WriteLine("C负责配菜!" + st);
}
/// 炒菜方法
public void ChaoCai(string st)
{
Console.WriteLine("D负责炒菜!" + st);
}
/// 开始做菜的方法
/// <param name="zuoCaiDelegate">委托作为参数传递</param>
public void StartZuoCai(ZuoCaiDelegate zuoCaiDelegate)
{
zuoCaiDelegate("1");
}
//定义一个做菜的委托
public delegate void TaskTest();
public static void test()
{ Console.WriteLine("测试"); }
static void Main(string[] args)
{
ZuoCai zuoCai = new ZuoCai();
ZuoCaiDelegate zuoCaiDelegatex = new ZuoCaiDelegate(zuoCai.ChaoCai);
zuoCaiDelegatex += zuoCai.ChaoCai;
zuoCaiDelegatex += zuoCai.ChaoCai;
zuoCaiDelegatex += zuoCai.ChaoCai;
zuoCaiDelegatex("D是奥巴马!");
Action tes = new Action(test);
Task ts = new Task(tes);
ts.Start();
//实例化一个做菜类
//实例化一个做菜的委托
ZuoCaiDelegate zuoCaiDelegate = new ZuoCaiDelegate(zuoCai.NaCai);
zuoCaiDelegate += zuoCai.QieCai;
zuoCaiDelegate += zuoCai.PeiCai;
zuoCaiDelegate += zuoCai.ChaoCai;
//开始做菜
//多委托的返回值是最后一个委托方法的返回值
zuoCai.StartZuoCai(zuoCaiDelegate);
Func<int, int, string> func = (x, y) => (x * y).ToString();
string xx=func(8,8);
Func<int, int, string> func2 = delegate(int x, int y) { return (x * y).ToString(); };
string xx2 = func2(8, 8);
}
}