Action<T> 无参数委托详解

2023-05-16

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>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Action<T> 无参数委托详解 的相关文章

  • Struts2:如何存储从操作到操作的安全用户名和密码

    在我的登录页面中 我通过用户名和密码 从 jsp 页面获取 登录 然后检查 LDAP 如果凭据正确 则继续浏览其他页面 我想在某个地方存储用户名和密码 因为在接下来的一些页面中 我可能需要它们来制作其他东西 我想将它们存储在会话中 但我担心
  • 批量导出psd文件为png

    我有数千个 psd 文件要另存为 png 除了图像中心的小文本之外 psd 文件没有什么不同 有没有办法自动化这项工作 是的 打开您的操作窗口 创建新动作 记录您自己打开 将文件另存为 png 并关闭文件的情况 然后在文件 gt 自动 gt
  • 我可以在 Action 或 Func 委托中使用参数吗?

    当我尝试在操作委托中使用参数时 private Action
  • 检测用户在自定义操作中选择“所有用户”还是“仅我”

    我试图检测用户在安装程序期间是否选择了 所有用户 或 仅我 广播 我有一个自定义操作设置 它覆盖了多个方法 OnCommit OnBeforeInstall 等 现在我正试图在 OnCommit 期间找出这些信息 我读过我想要获取的属性是
  • 使用 Applescript/Automator 检查活动的互联网连接

    我有一个 Automator 工作流程来 ping 服务器 并下载我经常使用的时间表的最新副本 然后 该时间表会被复制到我的保管箱中 以便我可以在手机上查看 在工作流下载最新计划之前 它会从 Dropbox 中删除旧计划 这很有效 除非我没
  • 编辑 swf 文件中的动作脚本

    我已经尝试了 10 个小时来编辑这个 swf 文件 它看起来与反编译器中的预期完全一样 但是当我将其导出到闪存时 它是一个空白画布 并且我无法访问操作脚本 我想做的只是在动作脚本中编辑一些东西 我什至不碰电影 有没有更简单的方法来做到这一点
  • 如何确定 QAction 的来源?

    我想知道是否有任何简单 优雅的方法来确定 QAction 的来源 我的意思是我有一个 QAction 它被添加到多个 QWidget 带有QWidget addAction http doc qt nokia com latest qwid
  • 如何在 Ruby on Rails 中基于每个操作禁用日志记录?

    我有一个 Rails 应用程序 它的一个操作被频繁调用 在我开发时很不方便 因为它会产生大量我不关心的额外日志输出 我如何才能让 Rails 不记录这一操作的任何内容 控制器 操作 参数 完成时间等 我也想在 RAILS ENV 上对其进行
  • Action 到子动作的链接

    我已经调用了另一个视图Html Action方法 当用户单击操作链接时 我想在子视图内使用参数调用相同的操作 当我编写此代码时 我收到此错误消息 Html ActionLink link Configure new id 2 配置 操作只能
  • JSF 1.2 Action 和 ActionListener 中的异常之间的区别

    我注意到 JSF 1 2 当actionListener方法中抛出异常时不返回错误页面 但当action方法中抛出异常时返回错误页面 这是为什么 在这两种情况下它都能返回错误页面吗 任何抛出的异常FacesEvent http downlo
  • 提交时设置表单的操作属性?

    单击提交按钮后如何立即更改表单的操作属性
  • 有什么方法可以从内部函数中退出外部函数吗?

    在 PHP 中 如果我有一个函数调用另一个函数 有没有办法让被调用函数退出调用者函数而不杀死整个脚本 例如 假设我有一些类似的代码 p This is some text After this text I m going to call
  • Django 检查查询集模型类型的最佳方法

    我有一个 Django 操作函数 我想在基于不同模型的查询集上使用它 检查我的查询集组成的模型类型的最佳方法是什么 假设我想检查 models py 中定义的 Library 类 目前我可以使用它来工作 for object in quer
  • Symfony:如何更改操作中的表单字段属性?

    我有一个带有 sfWidgetFormChoice 的功能表单 它充当复选框列表 我可以通过以下方式将复选框默认设置为 勾选 status gt new sfWidgetFormChoice array choices gt array 1
  • 如何使用 FakeItEasy 伪造一个动作<>

    我正在使用 FakeItEasy 库为我的单元测试创 建假货 我有一个ClassUnderTest我想测试该方法MethodToTest Data dataObject 这个方法正在调用我想伪造的接口的方法 public interface
  • 在 socket.on() 的回调上调度操作

    所以基本上我得到了这个套接字 它工作正常 向我发送 新订单 消息 我正在使用 redux 并且我想分派一个操作 然后减速器会得到它并且我的商店将会更新 但这段代码没有做任何事情 socket on new order order gt re
  • 目标操作 uicontrol 事件

    我一定在这里遗漏了一些明显的东西 但是 UIControl有一个方法 void addTarget id target action SEL action forControlEvents UIControlEvents controlEv
  • 为什么这个动作不抽象? [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我很难理解为什么一个类中的一个操作是抽象的 而另一个类中的操作不是 源代码1 编译时出错 https gyazo com cd3c
  • 以字符串数组作为参数的操作

    我想调用与此 uri 类似的操作 http server controller action columns firstname columns lastname columns age 并像这样使用它 public ActionResul
  • 如何在自定义操作期间移动进度条

    在安装程序中运行自定义操作时 没有进度条 我们正在使用立即 C 管理代码自定义操作 运行自定义操作时是否有其他方法显示进度 预先致谢 维卢 使用 ProgressText 元素 模板 属性是放置标记以反映进度的地方 例如 请参阅标准 Ins

随机推荐

  • qt中QString与char *类型相互转换

    在进行编程时 xff0c 我们经常需要用到字符串这种类型 xff0c 毫无疑问 xff0c Qt 库中也对字符串类型进行了封装 xff0c QString 类提供了你能想到的所有字符串操作方法 xff0c 给开发者带来了极大方便 但是我们在
  • 总结以下三种方法,实现c#每隔一段时间执行代码:

    总结以下三种方法 xff0c 实现c 每隔一段时间执行代码 xff1a 方法一 xff1a 调用线程执行方法 xff0c 在方法中实现死循环 xff0c 每个循环Sleep设定时间 xff1b 方法二 xff1a 使用System Time
  • struct的创建

    本文实例分析了C 中结构 struct 的部分初始化和完全初始化 xff0c 分享给大家供大家参考 具体分析如下 xff1a 假设有这样一个值类型struct xff0c 如下所示 xff1a 1 2 3 4 5 6 7 8
  • c++全局变量的正确声明

    C 43 43 中全局变量声明错误情况 造成 LNK2005 错误主要有以下几种情况 xff1a 1 xff0e 重复定义全局变量 可能存在两种情况 xff1a A 对于一些初学编程的程序员 xff0c 有时候会以为需要使用全局变量的地方就
  • C++函数声明和定义

    在上一节 xff0c 我们已经学会了如何阅读函数原型和如何调用一个函数 然而 xff0c 仅靠系统给出的标准库函数是不够用的 我们有时候要根据我们的实际要求 xff0c 写出一个合适自己使用的函数 那么 xff0c 我们如何来自己动手编写一
  • cpp之间函数引用和类引用的方法

    除了 include外 xff0c cpp文件之间怎么引用函数 file C h ifndef FOO H define FOO H extern void sayHello endif FOO H file B cpp include 3
  • 在C++中调用DLL中的函数

    1 dll 的优点 代码复用是提高软件开发效率的重要途径 一般而言 xff0c 只要某部分代码具有通用性 xff0c 就可将它构造成相对独立的功能模块并在之后的项目中重复使用 比较常见的例子是各种应用程序框架 xff0c ATL MFC 等
  • HC-SR04超级简单教程(快速入门)

    目录 一 模块介绍 xff08 个人理解 xff09 1 简单理解 2 该模块的参数 二 HC SR04的操作 三 代码 1 代码前的注意事项 2 关键代码 四 代码实战效果图 五 结束 一 模块介绍 xff08 个人理解 xff09 1
  • C++中对于类来说头文件(.h)和源文件(.cpp)都应该写些什么 (类的常规创建)

    头文件 h xff1a 写类的声明 xff08 包括类里面的成员和方法的声明 xff09 函数原型 define常数等 xff0c 但一般来说不写出具体的实现 在写头文件时需要注意 xff0c 在开头和结尾处必须按照如下样式加上预编译语句
  • c#的接口详解

    什么是接口 xff1f 其实 xff0c 接口简单理解就是一种约定 xff0c 使得实现接口的类或结构在形式上保持一致 个人觉得 xff0c 使用接口可以使程序更加清晰和条理化 xff0c 这就是接口的好处 xff0c 但并不是所有的编程语
  • C语言中的全局变量定义与使用

    1 书中对 全局变量 的定义 在函数内定义的变量是局部变量 xff0c 而在函数外定义的变量叫做外部变量 xff0c 外部变量是全局变量 全局变量可以为本文件中其他函数所共用它的有效范围从定义变量的位置开始到本源文件结束 建立全局变量的作用
  • C,C++,C#note

    1 c 43 43 中的类的定义和声明可以都写在头文件中 xff0c 然后cpp文件include头文件 xff1b 也可以声明在头文件 xff0c 定义在cpp文件 xff1b 或者所有声明和定义都放在cpp文件 xff1b 混写定义与声
  • 在C++中可以用3种方法访问一个字符串

    用字符数组存放一个字符串 例6 10 定义一个字符数组并初始化 xff0c 然后输出其中的字符串 ol class snippet num style margin top 0px margin bottom 0px margin left
  • 动态存储和静态存储区域区别

    动态存储方式 所谓动态存储方式是指在程序运行期间根据需要进行动态的分配存储空间的方式 动态存储变量是在程序执行过程中 xff0c 使用它时才分配存储单元 xff0c 使用完毕立即释放 典型的例子是函数的形式参数 xff0c 在函数定义时并不
  • c++中默认32位int类型转换截取高位部分

    int类型的变量固定为4个字节 xff0c 共32位 int类型变量初始值一般为0 xff0c 范围 2 31 2 31 1 即 2147483648 xff0c 2147483647 16 位系统下 xff0c int 是 2 个字节 x
  • c#-接口

    c 中的接口中必须是未实现的方法 xff0c 例如属性 xff0c 事件 xff0c 索引器 xff0c 一般函数等 除此之外不能有其他的成员 xff0c 类可以继承两个或两个以上的接口 xff0c 派生类中必须实现接口中的所有方法
  • C# SerialPort 读写三菱FX系列PLC

    1 xff1a 串口初始化 com 61 new SerialPort 34 COM3 34 9600 Parity Even 7 StopBits One 2 xff1a 打开关闭串口 if com IsOpen com Close co
  • c++中用new和不用new创建对象的本质区别

    1 xff1a 作用域不同 不用new xff1a 作用域限制在定义类对象的方法中 xff0c 当方法结束时 xff0c 类对象也被系统释放了 xff0c xff08 安全不会造成内存系统泄漏 xff09 用new xff1a 创建的是指向
  • ubuntu系统通过ifconfig查看eth0只有ipv6没有ipv4的解决方案

    只有inet6 addr 配置eth0 3 重新启动sudo etc init d networking restart IP地址出来了 看起来就正常 4 看其他资料 xff0c linux 43 QT4 0 xff0c 在这个开发板上的l
  • Action<T> 无参数委托详解

    C 委托Action Action lt T gt Func lt T gt Predicate lt T gt CLR环境中给我们内置了几个常用委托Action Action lt T gt Func lt T gt Predicate