平时我们如果要用到委托一般都是先声明一个委托类型,比如:

private delegate string Say();

string说明适用于这个委托的方法的返回类型是string类型,委托名Say后面没有参数,说明对应的方法也就没有传入参数。

写一个适用于该委托的方法:

     public static string SayHello(){return "Hello";}

最后调用:

       static void Main(string[] args){Say say = SayHello;Console.WriteLine(say());}

这里我们先声明委托,然后再将方法传给该委托。有没有办法可以不定义委托变量呢?

答案是肯定的,我们可以用Func.

Func是.NET里面的内置委托,它有很多重载。

Func<TResult>:没有传入参数,返回类型为TResult的委托。就像我们上面的Say委托,就可以用Func<string>来替代,调用如下:

      static void Main(string[] args){Func<string> say = SayHello;//Say say = SayHello;
            Console.WriteLine(say());}

怎么样,有了Func很简单吧。看一下Func别的重载。

Func<T, TResult> 委托:有一个传入参数T,返回类型为TResult的委托。如:

     //委托 传入参数类型为string,方法返回类型为intFunc<string, int> a = Count;

      //对应方法public int Count(string num){return Convert.ToInt32(num);}

Func<T1, T2, TResult> 委托:有两个传入参数:T1T2,返回类型为TResult

类似的还有Func(T1, T2, T3, TResult) 委托、Func(T1, T2, T3, T4, TResult) 委托等。用法差不多,都是前面为方法的传入参数,最后一个为方法的返回类型。

Func也可以与匿名方法一起使用如:

        public static void Main(){Func<string, int, string[]> extractMeth = delegate(string s, int i){char[] delimiters = new char[] { ' ' };return i > 0 ? s.Split(delimiters, i) : s.Split(delimiters);};string title = "The Scarlet Letter";// Use Func instance to call ExtractWords method and display resultforeach (string word in extractMeth(title, 5))Console.WriteLine(word);}

同样它也可以接 lambda 表达式

  public static void Main(){char[] separators = new char[] {' '};Func<string, int, string[]> extract = (s, i) => i > 0 ? s.Split(separators, i) : s.Split(separators) ;string title = "The Scarlet Letter";// Use Func instance to call ExtractWords method and display resultforeach (string word in extract(title, 5))Console.WriteLine(word);}

Func都是有返回类型的,如果我们的方法没有返回类型该怎么办呢?铛铛铛,这时Action就要粉墨登场了。

Action 委托:没有传入参数,也没有返回类型,即Void。如:

       static void Main(string[] args){Action say = SayHello;            say();}public static void SayHello( ){Console.WriteLine("Say Hello");}

Action<T> 委托:传入参数为T,没有返回类型。如:

      static void Main(string[] args){Action<string> say = SayHello;say("Hello");}public static void SayHello(string word ){Console.WriteLine(word);}

Action<T1, T2> 委托:两个传入参数,分别为T1T2,没有返回类型。

Action同样的还有许多其它重载,每个重载用法一样,只是方法的传入参数数量不一样。

其实ActionFunc的用法差不多,差别只是一个有返回类型,一个没有返回类型,当然Action也可以接匿名方法和Lambda表达式。

匿名方法:

    static void Main(string[] args){Action<string> say = delegate(string word){Console.WriteLine(word);};say("Hello Word");}

Lambda表达式:

     static void Main(string[] args){Action<string> say = s => Console.WriteLine(s);say("Hello Word");}

转载于:https://www.cnblogs.com/ajunForNet/p/4462426.html

Func与Action相关推荐

  1. Func vs. Action vs. Predicate [复制]

    本文翻译自:Func vs. Action vs. Predicate [duplicate] This question already has an answer here: 这个问题在这里已有答 ...

  2. 第十节:委托和事件(2)(泛型委托、Func和Action、事件及与委托的比较)

    一. 泛型委托 所谓的泛型委托,即自定义委托的参数可以用泛型约束,同时内置委托Func和Action本身就是泛型委托. 将上一个章节中的Calculator类中的方法用自定义泛型委托重新实现一下. 1 ...

  3. [C#基础]Func和Action学习

    目录 委托 Action Func 总结 委托 委托的那些事 关于委托的基本定义,在很久之前的这篇文章中,有个简单的介绍.稍微回顾一下. 委托是c#中类型安全的,可以订阅一个或多个具有相同签名方法的函 ...

  4. 什么是LambdaExpression,如何转换成Func或Action(2)

    序言 在上一篇中,我们认识了什么是表达式树.什么是委托,以及它们的关系.可能是我功力不好,貌似大家都不怎么关注,没有讲解出不同角度的问题. 学习一种新技术,是枯燥的过程,只有在你掌握后并能运用时才能从 ...

  5. Func 与Action

    Func< >   封装一个具有一个参数并返回 TResult 参数指定的类型值的方法, Action<T> 委托封装一个方法,该方法只有一个参数并且不返回值. 其实都是一个委 ...

  6. Func和Action的介绍及其用法

    Func是一种委托,这是在3.5里面新增的,2.0里面我们使用委托是用Delegate,Func位于System.Core命名空间下,使用委托可以提升效率,例如在反射中使用就可以弥补反射所损失的性能. ...

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

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

  8. 泛型委托 Predicate/Func/Action

    Predicate 泛型委托   表示定义一组条件并确定指定对象是否符合这些条件的方法.此委托由 Array 和 List 类的几种方法使用,用于在集合中搜索元素. 看看下面它的定义: // Summ ...

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

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

最新文章

  1. 【文本分类】A C-LSTM Neural Network for Text Classification
  2. saltstack一些常用模块和api调用方法
  3. 《Adobe Photoshop CS5中文版经典教程(全彩版)》—第1课1.2节使用工具
  4. windows下安装多个tomcat服务
  5. 三十三、深入Python中的itertools模块
  6. 非cpu0启动linux,SD卡无法启动Linux的问题及解决
  7. python 图表_使用Streamlit-Python将动画图表添加到仪表板
  8. python正确打开方式_Python log 的正确打开方式
  9. oracle批量执行_批量随机键值查询测试
  10. 时间序列数据处理2——时间序列聚类算法
  11. arm gdb 编译与安装
  12. 【.net】C#如何发送电子邮件
  13. 自己动手编写CSDN博客备份工具-blogspider之源码分析(1)
  14. python从入门到实践十二章
  15. Apollo星火计划学习笔记|L1 Apollo平台安装(2021年9月更新)
  16. JAVA基础 网络编程
  17. golang 字符串转整形 string 转 int ,go string 转 int
  18. AltiumDesigner覆铜挖空技巧总结
  19. 20、生鲜电商平台-优惠券设计与架构
  20. 如果使用PostGIS的ST_Area函数计算多边形面积

热门文章

  1. 支持html5浏览器速查
  2. Linux中检查本地系统上的开放端口列表的方法
  3. luoguP4503 [CTSC2014]企鹅QQ hash
  4. VS2017登陆不了,TFS无法连接成功的问题
  5. 对称加密——对入参进行DES加密处理
  6. 建造者模式(工厂模式6)
  7. 【Xamarin笔记】Events, Protocols and Delegates
  8. Haha!Sniffer Pro终于可以用啦~
  9. RxJava flatMap操作符用法详解
  10. c++疯狂代码之读和写。。。(用读操作来触发写)