c#_Func和Action委托简介

Action的用法
我们定义没有返回值没有参数的委托这样的:

   private delegate void EatRice(); //定义一个eatrice委托类型

写一个无返回值无参数的函数:

private static void  Eat()
{
    Console.WriteLine("我吃饭了");
}

然后声明并调用:

static void Main(string[] args)
{
    EatRice eatRice =Eat;//实例化委托类型
    eatRice();//调用委托
}


问题来了:有没有办法不定义委托,直接调用呢?当然是可以的,直接用Action

Action是.net 内置的委托(F12之后有种被骗的感觉),有很16个重载,低版本好像没这么多

        static void Main(string[] args)
        {
            Action eat = Eat;
            eat();
        }
        private static void  Eat()
        {
            Console.WriteLine("我吃饭了");
        }

还有Action<T> 委托,说是有16个“重载”(其实这种说法不正确),也就是可以最多可以接收16个 T类型的参数
演示一下Action<T,T> 接收两个T类型的参数委托(Action的委托重点是一定没有返回值类型)

        static void Main(string[] args)
        {
            Action<int ,string> eat = Eat;
            eat(5,"苹果");
        }
        private static void  Eat(int  num,string  name)
        {
            Console.WriteLine($"我吃了{num}个{name}");
        }


我们F12转到定义看看,结果有点失望,原来也就是用delegate 关键字定义一个Action的名称。国际惯例,还是发张图

可以接匿名函数使用吗?当然是可以的, lambda表达式也是可以的

        static void Main(string[] args)
        {
            Action<int ,string> eat = delegate(int x,string  name) {
                Console.WriteLine($"我吃饭{x}个{name}");
            };
            eat(5,"苹果");
        }

lambda表达式:

Action<int, string> eat = (num, name) =>
{
    Console.WriteLine($"我吃饭{num}个{name}");
};
eat(5,"苹果");

虽然上面只是告诉我们Action如何使用,但是并没有说明它的作用体现在哪里。写一个发送请求的方法你就会知道它是有作用的    

        static void Main(string[] args)
        {
            sendPost(success => { Console.WriteLine(success); },//实现响应成功做哪些事情
                errorAction => { Console.WriteLine(errorAction); });//实现失败做哪些事情
        }
        private static void sendPost(Action<string>  errorAction,Action<string> successAction)
        {
            
            bool resSuccess = true;//发送请求,接收数据是否成功
            string errorCode = "1004";
            if (resSuccess)
            {
                successAction("响应成功");
            }
            else
            {
                errorAction("响应失败,errorCode"+errorCode);
            }
        }

使用发送请求方法的时候,将Action委托作为参数去实现。这有点类似jquery的ajax 方法 error,success去回调。

 

Action 的委托没有返回值,那要是有返回值的函数怎么做,恰恰相反Func就是专门解决这样一个事情的必须有返回值参数(0-16 T类型参数)


Func的用法
在不使用Func委托时我们来写一个计算两个int类型乘积的委托返回值是int。      

        private delegate int Calc(int a,int b); //定义一个Calc委托类型 ,计算a*b
        static void Main(string[] args)
        {
            Calc calc = calcMul;//实例化委托
            Console.WriteLine(calc(10,12));        //调用委托
        }
        private static int calcMul(int  a ,int b)
        {
            return a * b;
        }

不使用delegate关键字声明委托直接使用内置写好的Func关键字这样就OK了。

        static void Main(string[] args)
        {
            Func<int, int, int> calc = calcMul;
            Console.WriteLine( calc(12,45));
        }
        private static int calcMul(int  a ,int b)
        {
            return a * b;
        }

      Func至少有一个T类型参数作为返回值。规定是将最后一个参数作为返回值。
Func结合匿名方法和lambda表达式也是可以的。

        static void Main(string[] args)
        {
            Func<int, int, int> calc = delegate (int x, int y)
            {
                return x * y;
            };
            Console.WriteLine(calc(10,45));
        }

lambda表达式:

        static void Main(string[] args)
        {
            Func<int, int, int> calc =(x,y)=>
            {
                return x * y;
            };
            Console.WriteLine(calc(10,45));
        }

栗子:

using System;
namespace DelegateFuncAction
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<double, double,double> DoAddtion = calculate.addtion;
            double result = DoAddtion(20, 30);
            Console.WriteLine("Func带返回参数委托做加法结果为:{0}",DoAddtion(10,20));
            calculate c=new calculate();
            Action<double, double> DoSubstraction = c.substraction;
            DoSubstraction(90, 20);
        }
    }
    class calculate
    {
        public static double addtion(double x, double y)
        {
            return x + y;
        }
        public void substraction(double x, double y)
        {
            Console.WriteLine("Action不带返回参数委托做减法结果为:{0}",x-y);
        }
    }
}

输出结果:

Func带返回参数做加法结果为:30

Action不带返回参数委托做减法结果为:70

 


至于Func为什么是很有作用,这个就不多写了,和Action差不多,委托还需要在实践中不断使用,就会发现这两个玩意的经典之处。

篇文章也只是介绍Func和Action的简单用法,如果你想对委托有更深刻的理解,我推荐看看这篇文章 http://www.cnblogs.com/r01cn/archive/2012/11/30/2795977.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值