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*bstatic 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

c#_Func和Action委托简介相关推荐

  1. C#中的三种委托方式:Func委托,Action委托,Predicate委托

    C#中的三种委托方式:Func委托,Action委托,Predicate委托. Func,Action,Predicate全面解析 首先来说明Func委托,通过MSDN我们可以了解到,Func委托有如 ...

  2. C# Action 委托

    本文转自:https://www.cnblogs.com/dotnet261010/p/10108791.html 1.什么是Action泛型委托 Action是.NET Framework内置的泛型 ...

  3. 委托——Action委托和Func委托

    委托:代购 private delegate void Buy();//定义想委托的事情--买东西 public static void DaiGou()//委托方--代购方 {Debug.logEr ...

  4. Spark的transformation和action算子简介

    transformation算子 map(func) 返回一个新的分布式数据集,由每个原元素经过func函数处理后的新元素组成 filter(func) 返回一个新的数据集,由经过func函数处理后返 ...

  5. GitHub Action入门简介

    1. What is GitHub Actions? GItHub Actions是一个持续集成和持续交付的平台,能够让你自动化你的编译.测试和部署流程. GitHub 提供 Linux.Window ...

  6. 七天学习计划_c#_[2][3][4][5]委托、事件、委托与事件的区别、泛型委托、Func\Action\predicate

    由于委托之前的博客已经详细写了,这里就简单的过一遍,复习一下: 了解委托 基于委托开发事件驱动程序变得非常简单. 使用委托可以大大简化多线程编程难度. 理解委托 委托也可以看做成一种数据类型,可以定义 ...

  7. c# 带返回值的action_C#委托Action、ActionT、FuncT、PredicateT

    一.Action Action封装的方法没有参数也没有返回值,声明原型为: 1 public delegate void Action(); 用法如下: 1 public void Alert() 2 ...

  8. C#委托Action、ActionT、FuncT、PredicateT

    CLR环境中给我们内置了几个常用委托Action. Action<T>.Func<T>.Predicate<T>,一般我们要用到委托的时候,尽量不要自己再定义一 个 ...

  9. 泛型委托Action与ActionT

    以前都是自己写委托,其实系统内部给我们系统了委托的. Action --委托的非泛型版本就是一个无参数无返回值的委托. Action<T>--委托的泛型版本是一个无返回值,但是参数个数及类 ...

最新文章

  1. 个人博客 SEO 优化(2):站内优化
  2. 操作系统上机题目(多进程1)
  3. python 模拟用户点击浏览器_使用python进行模拟浏览器操作
  4. 查看详细_教师资格准考证开始打印!点击查看详细流程!
  5. 当我们谈数据库时,是在谈什么?
  6. [PYTHON]一个简单的单元測试框架
  7. Android中加载SVGA格式图片
  8. Android App加壳中的整体dex加壳的原理和脱壳
  9. centos安装aria2c_CentOS安装aria2 + yaaw实现离线下载
  10. 一个最全产品开发流程
  11. java取0到999整数_Java中输入一个0到999的整数 怎么弄? 谢谢了、
  12. redis报错 Error getaddrinfo ENOTFOUND
  13. Photoshop CS6 序列号完美激活教程
  14. iOS签名校验那些事儿
  15. 禅道 php7.1,Centos7安装PHP7 + 禅道(Nginx 1.18 + PHP7.2)
  16. 第一次学习Web的总结
  17. 这款开源终端工具逼格更高!比 Xshell 好用
  18. 模拟一个类似LinkedList的集合
  19. 有没有比较好的建站系统可推荐?
  20. 【云计算】基于VMware Vsphere云平台的设计与实现

热门文章

  1. 利用rank函数实现自动排序
  2. python读写excel数据--pandas
  3. word打出来的字体总是变宋体
  4. kivy中kv语言的变态用法
  5. 学号20175313 《实现Linux下cp XXX1 XXX2的功能(一)》第九周
  6. [Unity3d]制作打包并载入AssetBundle
  7. Spring Cloud 注册中心在tomcat中部署
  8. CrazyWing:Python自动化运维开发实战 六、流程控制
  9. 12C -- DDL日志
  10. getReadableDatabase与getWritableDatabase的区别