C#委托Action、Action<T>、Func<T>、Predicate<T>

CLR环境中给我们内置了几个常用委托Action、 Action<T>、Func<T>、Predicate<T>,一般我们要用到委托的时候,尽量不要自己再定义一 个委托了,就用系统内置的这几个已经能够满足大部分的需求,且让代码符合规范。

一、Action

Action封装的方法没有参数也没有返回值,声明原型为:

1 public delegate void Action();

用法如下:

1  public void Alert()
2  {
3     Console.WriteLine("这是一个警告");
4  }
5
6  Action t = new Action(Alert); //  实例化一个Action委托
7  t();

如果委托的方法里的语句比较简短,也可以用Lambd表达式直接把方法定义在委托中,如下:

1 Action t = () => { Console.WriteLine("这是一个警告"); };
2 t();

二、Action<T>

Action<T>是Action的泛型实现,也是没有返回值,但可以传入最多16个参数,两个参数的声明原型为:

1 public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2);

用法如下:

1 private void ShowResult(int a, int b)
2 {
3     Console.WriteLine(a + b);
4 }
5
6 Action<int, int> t = new Action<int, int>(ShowResult);//两个参数但没返回值的委托
7 t(2, 3);

同样也可以直接用Lambd表达式直接把方法定义在委托中,代码如下:

1 Action<int, int> t = (a,b) => { Console.WriteLine(a + b); };
2 t(2, 3);

三、Func<T>

Func<T>委托始终都会有返回值,返回值的类型是参数中最后一个,可以传入一个参数,也可以最多传入16个参数,但可以传入最多16个参数,两个参数一个返回值的声明原型为:

1 public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);

用法如下:

1 public bool Compare(int a, int b)
2 {
3     return a > b;
4 }
5
6 Func<int, int, bool> t = new Func<int, int, bool>(Compare);//传入两个int参数,返回bool值
7 bool result = t(2, 3);

同样也可以直接用Lambd表达式直接把方法定义在委托中,代码如下:

1 Func<int, int, bool> t = (a, b) => { return a > b; };
2 bool result = t(2, 3);

四 、Predicate<T>

Predicate<T>委托表示定义一组条件并确定指定对象是否符合这些条件的方法,返回值始终为bool类型,声明原型为:

1 public delegate bool Predicate<in T>(T obj);

用法如下:

1 public bool Match(int val)
2 {
3     return val > 60;
4 }
5
6 Predicate<int> t = new Predicate<int>(Match);   //定义一个比较委托
7 int[] arr = { 13, 45, 26, 98, 3, 56, 72, 24 };
8 int first = Array.Find(arr, t);                 //找到数组中大于60的第一个元素

同样也可以直接用Lambd表达式直接把方法定义在委托中,代码如下:

1 Predicate<int> t = val => { return val > 60;};   //定义一个比较委托
2 int[] arr = { 13, 45, 26, 98, 3, 56, 72, 24 };
3 int first = Array.Find(arr, t);                  //找到数组中大于60的第一个元素

总结:

  • 如果要委托的方法没有参数也没有返回值就想到Action
  • 有参数但没有返回值就想到Action<T>
  • 无参数有返回值、有参数且有返回值就想到Func<T>
  • 有bool类型的返回值,多用在比较器的方法,要委托这个方法就想到用Predicate<T>

ActionT 无参数委托详解相关推荐

  1. 基础拾遗------委托详解

    基础拾遗: 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗---- ...

  2. 第 19 节 委托详解

    第19节 委托详解(还不怎么理解) 什么是委托 委托的声明(自定义委托) 委托的一般使用 委托的高级使用 什么是委托 委托(delegate)是函数指针的"升级版" 实例:C/C+ ...

  3. Python必备基本技能——命令行参数args详解

    Python必备基本技能--命令行参数args详解 1. 效果图 2. 源码 2.1 简单命令行参数 2.1 轮廓检测源代码 参考 这篇博客将介绍一项开发人员.工程师和计算机科学家必备的技能--命令行 ...

  4. ajax 页面无刷新,Ajax的页面无刷新实现详解(附代码)

    这次给大家带来Ajax的页面无刷新实现详解(附代码),Ajax页面无刷新实现的注意事项有哪些,下面就是实战案例,一起来看一下. ajax (ajax开发) AJAX即"Asynchronou ...

  5. 线程池的创建及参数设置详解

    一. 常见线程池 线程池的创建方法主要有两类,第一是通过Executors 创建线程池,第二是通过 ThreadPoolExecutor 创建线程池. 首先我们来看通过Executors 创建的线程池 ...

  6. 【深入理解Hadoop原理】Hadoop 参数配置 详解

    Hadoop 参数配置 详解 一.常用端口 组件 节点 默认端口 配置 用途说明 HDFS DataNode 50010 dfs.datanode.address datanode服务端口,用于数据传 ...

  7. ANSYS Workbench接触设置面板各参数含义详解

    ANSYS Workbench接触设置面板各参数含义详解    Ansys Workbench的接触设置面板由接触范围设置(Scope),基本参数定义(Definition),高级选项(Advance ...

  8. JavaScript(js)事件冒泡、事件捕获、事件委托详解

    JavaScript(js)事件冒泡.事件捕获.事件委托详解 1.什么是事件 JavaScript和HTML之间的交互是通过事件实现的.事件,就是文档或浏览器窗口发生的一些特定的交互瞬间.可以使用监听 ...

  9. 转速环PI参数整定详解(一)——电机传递函数的来源

    记得很久以前写过一篇转速环PI参数整定的文章,但是实际效果却不太好,为此对这个遗留已久的问题,今天在这篇文章内详细阐述转速环参数的设计过程.由于也很长时间没有再碰自动控制原理这一块,因此文章将会附带回 ...

最新文章

  1. SCCM2016 集成WSUS提供补丁服务(一)
  2. LeetCode Insert Delete GetRandom O(1) - Duplicates allowed
  3. MySQL大表优化技术要点科普
  4. 机器学习中的参数调整
  5. SAP CRM的数据库表CRMD_PRICING
  6. 决策树有框架吗_决策框架
  7. python爬虫进阶教程:百万英雄答题辅助系统
  8. 应届生怒怼管理层后续:已离职、被标记永不录用?腾讯张军回应...
  9. 安装Windows 10 V1909对CPU有什么要求?
  10. openSSH服务及其应用
  11. php怎么实现ubb代码,php实现过滤UBB代码的类
  12. 计算机毕业设计ssm飞机售票管理系统63z52系统+程序+源码+lw+远程部署
  13. word新建文档默认文件名_如何更改保存Word文档时使用的默认文件名
  14. Linux学习总结(60)——Linux系统常用命令速查手册
  15. 常用的计算机优化软件有哪些,计算机常用的硬件和软件优化软件和优化方法有哪些,如何提高WindowsXP系统的运行速度和稳定性...
  16. Mybatis中mapper.xml中like模糊查询字符串,日期写法
  17. Freefilesync自动同步
  18. kotlin 原生字符串输出三个引号
  19. DailyFi - 9.15|PrimeDAO 完成 200万美元种子轮融资,Paradigm 研究员发布新 NFT 碎片化产品...
  20. XDOJ.172 构造表达式

热门文章

  1. getsize java_Java ZipEntry getSize()用法及代码示例
  2. dsp 数据类型强制转换_JavaSE第二章总结—数据类型
  3. 星空主题设计理念_敏捷协调,智慧运营:金蝶云·星空的产品设计理念与应用实践...
  4. 10G_Ethernet_02 10G Ethernet Subsystem 简介
  5. python中的正则表达式是干嘛的_操作python中的正则表达式(上)
  6. python聚类的结果显示_使用Python进行聚类
  7. python 解码gbk_Python3的url编码和解码,自定义gbk、utf-8的例子
  8. ansible图形化界面开源_MySQL常见的图形化工具
  9. VHDL汽车尾灯控制器的设计
  10. android 画布裁剪,一种基于Android系统对UI控件进行轮廓剪裁及美化的方法与流程...