C# 委托详解

一.委托的概念

C#中委托也叫代理,委托提供了后期绑定机制(官方解释),功能类似于C++中的函数指针,它存储的就是一系列具有相同签名和返回类型的方法的地址,调用委托的时候,它所包含的所有方法都会被执行。

二.委托的用法

1.声明委托

语法:修饰符 delegate <函数返回类型> <委托名> (<函数参数>)

2.类似于创建对象,委托实例化,将实例化一样签名的函数名作为参数传进"构造函数"

3.调用委托

a.像调用函数一样调用委托

b.通过Invoke调用委托

namespace Console0719
{
    class Program
    {
        public class DelegateTest
        {
            public static int add10(int a)
            {
                return 10 + a;
            }
            public static int add5(int a)
            {
                return 5 + a;
            }
        }
        //step1:声明委托(类似函数签名,无需实现)
        public delegate int Cal(int a);
        static void Main(string[] args)
        {
            //step2.声明委托实例,将实例化一样签名的函数名作为参数传进小括号
            Cal cal1 = new Cal(DelegateTest.add10);
            //step3.像调用函数一样调用委托
            Console.WriteLine(cal1(3)); //输出13      
            cal1 = new Cal(DelegateTest.add5);
            //step3.通过Invoke()调用委托
            Console.WriteLine(cal1.Invoke(3)); //输出8

        }
    }
}

三.委托的作用

1.回调函数

step1:函数中将委托的实例作为参数

step2:函数中调用委托

step3:将恰当的回调函数作为实参

namespace Console0719
{
    class Program
    {
       delegate void DelegateDone();
        static void Main(string[] args)
        {
            Program test = new Program();
            //step3:将恰当的回调函数作为实参
            test.Work(CallBack);
        }
        //step1:函数中将委托的实例作为参数
        void Work(DelegateDone callBack)
        {
            Console.WriteLine("回调执行之前");
            //step2:函数中调用委托
            callBack();
        }
        static void CallBack()
        {
            Console.WriteLine("回调执行成功");
        }
    }
}

2.提高代码复用性

3.降低耦合度,提升扩展性

四.委托的多播

委托可以调用多个方法,这被称为多播。 若要向委托的方法列表(调用列表)添加其他方法,只需使用加法运算符或加法赋值运算符(“+”或“+=”)添加两个委托,“-=”撤销委托。 例如:

namespace Console0719
{
    class Program
    {
       public delegate void DelTest();
        static void Main(string[] args)
        {
            Program test = new Program();
            DelTest del1 = new DelTest(work1);
            DelTest del2 = new DelTest(work2);
            DelTest del3 = del1 + del2;
            Console.WriteLine("+=结果:");
            del1 += work3;
            del1();
            Console.WriteLine("");
            //输出work1 work3

            Console.WriteLine("+结果:");
            del3();
            Console.WriteLine("");
            //输出work1 work2

            Console.WriteLine("-=结果:");
            del3 -= work1;
            del3();
            Console.WriteLine("");
            //输出work2
        }
        //step1:函数中将委托的实例作为参数
        static void work1()
        {
            Console.WriteLine("work1");
        }
        static void work2()
        {
            Console.WriteLine("work2");
        }
        static void work3()
        {
            Console.WriteLine("work3");
        }
    }
}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ellis1970

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值