对委托的初步理解

一、简单介绍

1、委托是什么?

委托是一种类,也是一种数据类型。

2、委托可以用来做什么?

委托可以用来作为回调方法,可以用于模板方法中。

二、委托的使用

1、自定义委托

step1 声明委托

delegate int TestDelegate(int x, int y);

step2 新建委托实例

step3 调用委托所指向的方法

TestDelegate testDelegate = new TestDelegate(add);
int sum = testDelegate.Invoke(10, 20);

private int add(int x, int y)
{
    return x + y;
}

委托所封装的方法返回值类型和参数类型要跟委托一致。

比如上述TestDelegate返回值类型是int,参数有两个且类型都是int,那么新建的testDelegate所封装的方法add必须满足返回值是int且带有两个int类型参数的条件。

2、C#的类库已经准备好的委托

2.1、Action:不带返回值

2.2、Func:带返回值

使用步骤:

step1 新建委托实例

step2 调用委托所指向的方法

使用方法:简单来说就是把Action和Func当普通类。

        public void TestAction()
        {
            Action<string> action = new Action<string>(ShowMsg);
            action.Invoke("Hello");
            action("Hello");
            Func<int, int, string> func = new Func<int, int, string>(AddNum);
            string result = func(5, 3);
            Console.WriteLine(result);
            result = func.Invoke(5, 1);
            Console.WriteLine(result);
        }
        private void ShowMsg(string msg)
        {
            Console.WriteLine(msg);
        }
        private string AddNum(int x, int y)
        {
            return $"Sum is {x + y}";
        }

注意点就是作为参数传进去的方法,他的输入和输出一定要跟新建的委托匹配上。

action()和action.Invoke()效果是一样的。

三、委托的使用示例

当主体方法代码执行到委托调用这一步时,代码进入到委托所指向的方法,当指向的方法运行结束再回到主体方法,这样就相当于主体方法提供了一个实现这个功能的模板,只需要传入不同的委托就可以实现整体流程。

比如计算器计算的过程:

 class Calculator
    {
        public void Calculate(int x, int y, Func<int, int, int> calFunc, Action<string> callBack)
        {
            int result = calFunc(x, y);
            if (result == 7)
                callBack?.Invoke("Get 7!");
        }
    }
    class NumberOperate
    {
        public int Add(int x,int y)
        {
            return x + y;
        }
        public int Sub(int x,int y)
        {
            return x - y;
        }
    }
        public void TestCalculator()
        {
            Calculator calculator = new Calculator();
            NumberOperate numberOperate = new NumberOperate();
            calculator.Calculate(10, -3, numberOperate.Add, (msg) =>
            {
                Console.WriteLine(msg);
            });
            calculator.Calculate(17, 10, numberOperate.Sub, printMsg);
        }

        private void printMsg(string msg)
        {
            Console.WriteLine("哈哈哈!{0}", msg);
        }

运行TestCalculator()结果如下:

对于计算器来说,加减乘除等等所有的计算大体逻辑是这样的:读取输入数值,计算,显示计算结果。

为了提高代码的复用,可以把这个处理逻辑写成一个模板方法,“计算”作为委托类型的参数传入这个模板方法中,“显示计算结果”也可以作为一个委托类型的参数 当作回调函数。

(暂时想不出合适的例子,欢迎评论指导)

总的来说就是委托可以让方法作为参数传入到其他方法中,利用好委托的话,可以大大提高代码的复用程度。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值