c#委托总结

一、什么是委托

顾名思义,委托就是让别人做事。委托是实现回调函数的一种机制。可能有人会问了,回调函数是个啥???

举个例子:我现在是一家公司的老板,公司现在在招聘.NET工程师,我们有一个小姐姐专门负责接受求职者投递的简历,我就告诉这个小姐姐,一旦收到新的简历就转发给我一份。

这个例子里小姐姐要做的工作:给我转发一份简历(回调函数里的操作),就是一个回调函数的作用。一旦有了满足条件(收到了新的简历),小姐姐就会转发给我(触发回调函数)。

二、委托的定义和使用

  1. 关键字delegate
// 定义委托,这个委托需要获取一个int型参数,返回void
internal delegate void MyDelegate(int value);
  1. 定义回调方法:这里定义了两个方法,一个静态,一个实例。正好看看调用方式的不同。注意:定义的回调方法签名必须和委托对象一致(这里都是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);
}
  1. 编写一个方法来触发回调函数:有三个参数:前两个做循环使用,后一个接收定义的委托对象。内部代码循环调用回调方法 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);
        }
    }
}
  1. 打印在控制台
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也不能把自己的商业机密给他们(源码),怎么办呢?两家做代理(使用委托)。

  1. 定义一个Tran12306
public class Tran12306
{
    /// <summary>
    /// 12306卖票方法
    /// </summary>
    public void SellingTickets()
    {
        Console.WriteLine("开始卖票了!");
    }
}
  1. 定义一个FlyPig
public class FlyPig
{
    public delegate void FlyPigDelegate();
    public static void Pig()
    {
        Console.WriteLine("我是飞猪团队");
    }
}
  1. 定义一个XieCheng
public class XieCheng
{
    public delegate void XieChengDelegate();
    public static void Xie()
    {
        Console.WriteLine("我是携程团队");
    }
}
  1. 控制台调用
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();
}

实现结果
在这里插入图片描述

四、多播委托

多播委托使用就是按顺序执行多个委托方法。
这里也是直接上代码,一定要自己去尝试敲一遍才能体会到多播委托的使用。

  1. 定义一个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;
    }
}
  1. 控制台使用多播委托
//声明一个委托
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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值