Action和Func在.NetFramework3.0之后出现的

1. Action

1.1. 特性介绍:

  • Acition 属于无参无返回值的函数类型
  • Action通过设置泛型,我们可以定义有多个参数, 无返回值的函数
  • 当函数有多个重载的时候,系统会自动匹配
  • Action是没有返回值的
  • 参数也是0或者最多16个

1.2. 源代码如下:

//
// 摘要:
//     封装一个方法,该方法不具有参数且不返回值。
[TypeForwardedFrom("System.Core, Version=3.5.0.0, Culture=Neutral,PublicKeyToken=b77a5c561934e089")]
public delegate void Action();//
// 摘要:
//     封装一个方法,该方法只有一个参数并且不返回值。
//
// 参数:
//   obj:
//     此委托封装的方法的参数。
//
// 类型参数:
//   T:
//     此委托封装的方法的参数类型。
public delegate void Action<in T>(T obj);......
//
// 摘要:
//     封装具有 16 个参数且不返回值的方法。
//
// 参数:
//   arg1:
//     此委托封装的方法的第一个参数。
//
//   arg2:
//     此委托封装的方法的第二个参数。
//
//   arg3:
//     此委托封装的方法的第三个参数。
//
//   arg4:
//     此委托封装的方法的第四个参数。
//
//   arg5:
//     此委托封装的方法的第五个参数。
//
//   arg6:
//     此委托封装的方法的第六个参数。
//
//   arg7:
//     此委托封装的方法的第七个参数。
//
//   arg8:
//     此委托封装的方法的第八个参数。
//
//   arg9:
//     此委托封装的方法的第九个参数。
//
//   arg10:
//     此委托封装的方法的第十个参数。
//
//   arg11:
//     此委托封装的方法的第 11 个参数。
//
//   arg12:
//     此委托封装的方法的第十二个参数。
//
//   arg13:
//     此委托封装的方法的第 13 个参数。
//
//   arg14:
//     此委托封装的方法的第十四个参数。
//
//   arg15:
//     此委托封装的方法的第十五个参数。
//
//   arg16:
//     此委托封装的方法的第 16 个参数。
//
// 类型参数:
//   T1:
//     此委托封装的方法的第一个参数的类型。
//
//   T2:
//     此委托封装的方法的第二个参数的类型。
//
//   T3:
//     此委托封装的方法的第三个参数的类型。
//
//   T4:
//     此委托封装的方法的第四个参数的类型。
//
//   T5:
//     此委托封装的方法的第五个参数的类型。
//
//   T6:
//     此委托封装的方法的第六个参数的类型。
//
//   T7:
//     此委托封装的方法的第七个参数的类型。
//
//   T8:
//     此委托封装的方法的第八个参数的类型。
//
//   T9:
//     此委托封装的方法的第九个参数的类型。
//
//   T10:
//     此委托封装的方法的第十个参数的类型。
//
//   T11:
//     此委托封装的方法的第 11 个参数的类型。
//
//   T12:
//     此委托封装的方法的第十二个参数的类型。
//
//   T13:
//     此委托封装的方法的第 13 个参数的类型。
//
//   T14:
//     此委托封装的方法的第十四个参数的类型。
//
//   T15:
//     此委托封装的方法的第十五个参数的类型。
//
//   T16:
//     此委托封装的方法的第 16 个参数的类型。
public delegate void Action<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12, in T13, in T14, in T15, in T16>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16);

1.3. 案例使用如下:

private void btnAction_Click(object sender, EventArgs e)
{Action pAction = new Action(() => {Console.WriteLine("小菜很帅");});pAction.Invoke();pAction = CallXiaoCaiHenShuai;pAction.Invoke();Action<string> pActionPars = new Action<string>( (name)=>{Console.WriteLine($"{name}很帅");});pActionPars.Invoke("xiaocaicai");
}public void CallXiaoCaiHenShuai()
{Console.WriteLine("小菜很帅");
}

效果如下:

2. Func

2.1 特性介绍:

  • Func只有带泛型的一种形式,Action有带泛型和不带的两种
  • Func 委托必须要带有一个返回值
  • 可以有0个或多达16个参数类型
  • 最后一个泛型参数代表返回类型,前面的都是参数类型
  • 参数类型必须跟指向的方法的参数类型按照顺序对应

2.1 源代码如下:

//
// 摘要:
//     封装一个方法,该方法不具有参数,返回由 TResult 参数指定的类型的值。
//
// 类型参数:
//   TResult:
//     此委托封装的方法的返回值类型。
//
// 返回结果:
//     此委托封装的方法的返回值。
[TypeForwardedFrom("System.Core,Version=3.5.0.0, Culture=Neutral,PublicKeyToken=b77a5c561934e089")]
public delegate TResult Func<outTResult>();

2.2 案例使用如下:

private void btnFunc_Click(object sender, EventArgs e)
{Func<string> pFunc = new Func<string>(() =>{return "小菜很帅";});Console.WriteLine(pFunc.Invoke());Func<string, string> pFuncParsInfo = new Func<string, string>((name)=>{return $"{name}很帅";});Console.WriteLine(pFuncParsInfo.Invoke("xiaocaicai"));
}

3. Action和Func的优劣

  • 3.1 优点

    • Action在.Net3.5之后官方都采用这两种方法
  • 3.2 缺点

    • 当Action和Func传递过多时,会出现函数意义不明确,可读性差,而且框架中的改动较大

C#中的Action和Func委托相关推荐

  1. 使用.NET中的Action及Func泛型委托

    原文 http://www.cnblogs.com/skm-blog/archive/2013/05/24/3096294.html 委托,在C#编程中占有极其重要的地位,委托可以将函数封装到委托对象 ...

  2. 在.net2.0中实现Action和Func方法

    由于这两个是在.net3.5中新加入的特性,所以我们需要自己写一下. 格式如下: delegate void Action();         delegate void Action<T, ...

  3. C#中的Action和Func 区别

    Action只能委托必须是无返回值的方法 Fun只是委托必须有返回值的方法 一.[action<>]指定那些只有输入参数,没有返回值的委托 Delegate的代码: public dele ...

  4. 如何使用 C# 中的 Action, Func,Predicate

    译文链接:https://www.infoworld.com/article/3057152/how-to-work-with-action-func-and-predicate-delegates- ...

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

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

  6. C#泛型委托Predicate、Action、Func

    Predicate Predicate泛型委托:表示定义一组条件并确定指定对象是否符合这些条件的方法.此委托由 Array 和 List 类的几种方法使用,用于在集合中搜索元素. 通过查看源码发现 P ...

  7. C#里关于委托的使用方法使用delegate、Action、func和Thread声明、锁安全

    1.委托的类型: Invoke or BeginInvoke Invoke或者BeginInvoke方法都需要一个委托对象作为参数.委托类似于回调函数的地址,因此调用者通过这两个方法就可以把需要调用的 ...

  8. C# 中的 Action, Func, EventHandler 和 EventHandlerTEventArgs

    C# 中常用内置委托 Action, Func, EventHandler 和 EventHandler<TEventArgs> 介绍 Action Delegate 封装一个没有返回值的 ...

  9. C#委托(delegate、Action、Func、predicate)和事件

    C#委托(delegate.Action.Func.predicate)和事件 - 园子的蜗牛 - 博客园 C#之委托 - 摸鱼王 - 博客园 C++函数指针与C#委托之间有何联系 - 51CTO.C ...

最新文章

  1. 深度学习|实例分割:3D-BoNet
  2. “我的开源项目被威胁了!”
  3. gpu服务器厂家_服务器内存和显存知识你了解多少
  4. mysql 查看innodb版本,mysql中查看innodb版本的方法
  5. 把执行结果转成json对象报错_JSONObject获取值后为一个对象,将对象转为JSONObject时报错...
  6. Universal-Image-Loader解析(二)——DisplayImageOptions的详细配置与简单的图片加载...
  7. 这些深度学习术语,你了解多少?(上)
  8. linux环境下rocketMq双master集群搭建
  9. 《JavaScript面向对象精要》——第1章 原始类型和引用类型 1.1 什么是类型
  10. 腾讯痛下杀手,是时候让区块链回归技术和应用的本质了!
  11. C语言中 malloc函数介绍
  12. 新高考十二种选科情况下,再选科目的考室安排的探索2.0版
  13. POJ 1625 Censored! (AC自己主动机 + 高精度 + DP)
  14. java游戏管理器虚拟按键_Android实现手机游戏隐藏虚拟按键
  15. Failing because I am unlikely to write too排查方案
  16. vba 关闭屏幕刷新
  17. centos 上搭建FC SAN
  18. Windows远程桌面提示CredSSP加密数据库修正
  19. Parsec测试基准程序在zynq板上测试
  20. 【MFC学习笔记】常见问题解答

热门文章

  1. 数值积分21 - Gass 高斯求积公式 Legendre勒让得多项式 高斯-勒让得求积公式
  2. android 地址转译,Android URLEncoder 转译中文
  3. 歪嘴一笑百媚生,b站鬼畜无颜色,分析“歪嘴战神”那该死的魅力
  4. The Suspects(并查集)
  5. [CVPR2018]PairedCycleGAN: Asymmetric Style Transfer for Applying and Removing Makeup
  6. flex图片拖动效果
  7. 88.【员工管理系统-springBoot】
  8. 【RSVP-BCI基本知识点】
  9. 只为让你听见更好的声音 吉利缤瑞音响升级牧童套餐喇叭
  10. RTSC与XDCTools