一、什么是委托
顾名思义,委托就是让别人做事。委托是实现回调函数的一种机制。可能有人会问了,回调函数是个啥???
举个例子:我现在是一家公司的老板,公司现在在招聘.NET工程师,我们有一个小姐姐专门负责接受求职者投递的简历,我就告诉这个小姐姐,一旦收到新的简历就转发给我一份。
这个例子里小姐姐要做的工作:给我转发一份简历(回调函数里的操作),就是一个回调函数的作用。一旦有了满足条件(收到了新的简历),小姐姐就会转发给我(触发回调函数)。
二、委托的定义和使用
- 关键字delegate
// 定义委托,这个委托需要获取一个int型参数,返回void
internal delegate void MyDelegate(int value);
- 定义回调方法:这里定义了两个方法,一个静态,一个实例。正好看看调用方式的不同。注意:定义的回调方法签名必须和委托对象一致(这里都是int 类型参数,没有返回值。这么说也不全对,涉及到协变和逆变。),这是因为将方法绑定到委托时,编译器会检测他们的兼容性。不符合的话回报编译错误。就比如有一个方法要传入String类型,我们给它传递了一个int类型一样。
这里为了方便演示就只把数字打印在了控制台。
/// <summary>
/// 静态回调方法
/// </summary>
/// <param name="value"></param>
public static void StaticShowInt(int value)
{
Console.WriteLine("静态的回调方法:{0}", value);
}
/// <summary>
/// 实例回调方法
/// </summary>
/// <param name="value"></param>
public void ShowInt(int value)
{
Console.WriteLine("实例回调方法:{0}", value);
}
- 编写一个方法来触发回调函数:有三个参数:前两个做循环使用,后一个接收定义的委托对象。内部代码循环调用回调方法 fb(val)的写法,其实就是相当于要调用的函数。例:
/// <summary>
/// 使用委托触发回调
/// </summary>
/// <param name="first">开始</param>
/// <param name="to">结束</param>
/// <param name="myDelegate">委托引用</param>
public static void Conter(int first, int to, MyDelegate myDelegate)
{
for (int i = first; i < to; i++)
{
if (myDelegate != null)
{
myDelegate(i);
}
}
}
- 打印在控制台
static void Main(string[] args)
{
Console.WriteLine("*****************委托静态方法调用********************");
Conter(1, 5, new MyDelegate(Program.StaticShowInt));
Console.WriteLine("*****************委托实例方法调用********************");
Program p = new Program();
Conter(1, 5, new MyDelegate(p.ShowInt));
Console.ReadKey();
}
效果实现是这样的
三、委托的应用,小例子:12306卖票
这里做一个小例子,比如12306卖票,但是,携程和飞猪也想卖票,但是12306也不能把自己的商业机密给他们(源码),怎么办呢?两家做代理(使用委托)。
- 定义一个Tran12306类
public class Tran12306
{
/// <summary>
/// 12306卖票方法
/// </summary>
public void SellingTickets()
{
Console.WriteLine("开始卖票了!");
}
}
- 定义一个FlyPig类
public class FlyPig
{
public delegate void FlyPigDelegate();
public static void Pig()
{
Console.WriteLine("我是飞猪团队");
}
}
- 定义一个XieCheng类
public class XieCheng
{
public delegate void XieChengDelegate();
public static void Xie()
{
Console.WriteLine("我是携程团队");
}
}
- 控制台调用
static void Main(string[] args)
{
Console.WriteLine("---------------------12306--------------------- ---------");
Tran12306 tran12306 = new Tran12306();
tran12306.SellingTickets();
Console.WriteLine("---------------------飞猪------------------------------");
FlyPigDelegate flyPig = new FlyPigDelegate(tran12306.SellingTickets);
FlyPig.Pig();
flyPig();
Console.WriteLine("---------------------携程------------------------------");
XieChengDelegate xieCheng = new XieChengDelegate(tran12306.SellingTickets);
XieCheng.Xie();
xieCheng();
Console.ReadKey();
}
实现结果
四、多播委托
多播委托使用就是按顺序执行多个委托方法。
这里也是直接上代码,一定要自己去尝试敲一遍才能体会到多播委托的使用。
- 定义一个MyDelegateDemo类
public class MyDelegateDemo
{
int num = 10;
/// <summary>
/// 加法
/// </summary>
/// <param name="a"></param>
/// <returns></returns>
public int Add(int a)
{
num += a;
return num;
}
/// <summary>
/// 乘法
/// </summary>
/// <param name="b"></param>
/// <returns></returns>
public int Ride(int b)
{
num *= b;
return num;
}
/// <summary>
/// 先乘后加
/// </summary>
/// <param name="c"></param>
/// <returns></returns>
public int RideAdd(int c)
{
int m = Ride(c);
int num = Add(m);
return num;
}
/// <summary>
/// Num的值
/// </summary>
/// <returns></returns>
public int getNum()
{
return num;
}
}
- 控制台使用多播委托
//声明一个委托
public delegate int JiSuan(int num);
static void Main(string[] args)
{
JiSuan RideAdd = null;
MyDelegateDemo myDelegateDemo = new MyDelegateDemo();
JiSuan rdie = new JiSuan(myDelegateDemo.Ride);
RideAdd += rdie;
JiSuan add = new JiSuan(myDelegateDemo.Add);
RideAdd += add;
int number = RideAdd(10);
Console.WriteLine(number);
//如果直接调用这个RideAdd方法结果为200
//int num = myDelegateDemo.RideAdd(10);
//Console.WriteLine("结果为:{0}", num);
Console.ReadKey();
}
希望得到批评与指正!!!
参考:https://www.cnblogs.com/jixiaosa/p/10687068.html