C# 委托详解

C# 中的委托 (初级应用)

前言

前段时间在整理C#知识点的时候,对于委托这个略微高级的概念有一些迷茫,经过查阅书籍,网上视频,现在终于对这个概念有了一定的认知。此篇文章也用于对自己所学知识的梳理。

一、委托的概念

官方的解释:委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。

梳理

  1. 委托是一个类
  2. 实际上是一个方法的模板
  3. 委托是一个方法的引用,不做实际意义的事
  4. 增加方法的可扩展性

对于第三点,举个例子:我现在在超市买东西,我同事打电话跟我说他鼠标没电了,让我带两节电池给他。
在这个例子中,"我同事"就是委托的对象,“我” 就是去完成这个委托的方法。

二、委托的声明语法
    /**
     * delegate 是声明委托的关键字
     * <return type> 返回值类型
     * <delegate-name> 委托名
     * <parameter list> 参数列表
     */
delegate <return type> <delegate-name> <parameter list>
三、委托的使用方式
这里我们用一个加减运算示例
以下代码是没有使用委托,单纯使用调用方法进行计算
        public static int Add(int a, int b)
        {
            return a + b;
        }
        public static int Sub(int a, int b)
        {
            return a - b;
        }
        static void Main(string[] args)
        {
            int a = 10, b = 5;
            Console.WriteLine(Add(a, b));
            Console.WriteLine(Sub(a, b));

            Console.ReadKey();
        }
使用委托
namespace 委托
{
    class Program
    {
        //声明一个委托,其返回值类型和参数需要与方法保持一致
        public delegate int Calc(int a, int b);
        public static int Add(int a, int b)
        {
            return a + b;
        }
        public static int Sub(int a, int b)
        {
            return a - b;
        }
        static void Main(string[] args)
        {
            int a = 10, b = 5;
            Console.WriteLine(Add(a, b));
            Console.WriteLine(Sub(a, b));

            //实例化委托
            Calc calc = new Calc(Add);
            //委托的调用(间接调用)
            calc.Invoke(a,b);
            //委托的调用(直接调用)
            calc(a, b);

            //注意,委托的间接调用和直接调用的结果是一致的

            Console.ReadKey();
        }
    }
}
四、委托的作用

上面介绍了委托的简单使用,那么问题来了,这样使用委托有什么意义呢?
直接使用方法名 Add(a, b) 不是更为简单吗
实际上,上面的示例代码只是为了演示委托的用法,没有实际的作用
上面委托的概念梳理中第二条提过,委托是方法的模板

namespace 委托
{
    class Program
    {
        //声明一个委托,其返回值类型和参数需要与方法保持一致
        public delegate int Calc(int a, int b);
        public static int Add(int a, int b)
        {
            return a + b;
        }
        public static int Sub(int a, int b)
        {
            return a - b;
        }
        /// <summary>
        /// 动态计算
        /// 通过外部传入的方法进行不同的计算方法
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <param name="calc"></param>
        /// <returns></returns>
        public static int ActiveCalc(int a, int b, Calc calc)
        {
            return calc.Invoke(a, b);
        }

        static void Main(string[] args)
        {
            int a = 10, b = 5;
            ActiveCalc(a, b, Add);
            ActiveCalc(a, b, Sub);
            
            Console.ReadKey();
        }
    }
}

通过上面的示例代码,我们可以发现在ActiveCalc方法的参数列表中传入了一个Calc委托,让这个方法具有了动态计算的能力
在外面调用时,我们只要根据业务需求,给实参传入不同的方法,即可在同一方法中得到不同的结果,也就是上文所提到的在方法中使用委托参数,可以使该方法增加可扩展性

特别一提的是:委托作为方法的模板,必须将方法的签名(即返回值与参数列表)与委托的签名保持一致
举个例子:我写了一段代码,今天我的代码突然出BUG了,但是我有更重要的事要去做,所以我委托小王去帮我改一下BUG。
在上面的例子中,我的委托人小王,必须要满足我的要求才能去替我做这件事情,要求就是小王能读懂代码,否则我不能委托他去提我完成这件事情
看懂代码就是参数,能否改好BUG就是返回值。

五、委托高级应用
  1. 多播
    委托对象可使用 “+” 运算符进行合并。一个合并委托调用它所合并的两个委托。只有相同类型的委托可被合并。“-” 运算符可用于从合并的委托中移除组件委托。
            Calc calc1 = new Calc(Add);
            Calc calc2 = Sub;//也可以这样实例化委托
            calc1 += calc2;
            calc.Invoke(a, b);
  1. 与Event(事件)配合使用
    在WinForm、WPF中,委托一般会与事件配合使用,如点击事件就是用委托去引用一个方法,去完成控件被点击的之后的操作。
    由于篇幅较多,此文不在赘述,有事件的话我会去整理一下文档,另开一篇幅专门讲述委托与事件这一块的内容
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值