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

  1. private delegate string Say();

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

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

  1. public static string SayHello()
  2. {
  3. return "Hello";
  4. }

最后调用:

  1. static void Main(string[] args)
  2. {
  3. Say say = SayHello;
  4. Console.WriteLine(say());
  5. }

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

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

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

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

  1. static void Main(string[] args)
  2. {
  3. Func<string> say = SayHello;
  4. //Say say = SayHello;
  5. Console.WriteLine(say());
  6. }

看一下Func别的重载。

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

  1. //委托 传入参数类型为string,方法返回类型为int
  2. Func<string, int> a = Count;
  1. //对应方法
  2. public int Count(string num)
  3. {
  4. return Convert.ToInt32(num);
  5. }

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

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

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

  1. public static void Main()
  2. {
  3. Func<string, int, string[]> extractMeth = delegate(string s, int i)
  4. {
  5. char[] delimiters = new char[] { ' ' };
  6. return i > 0 ? s.Split(delimiters, i) : s.Split(delimiters);
  7. };
  8.  
  9. string title = "The Scarlet Letter";
  10. // Use Func instance to call ExtractWords method and display result
  11. foreach (string word in extractMeth(title, 5))
  12. Console.WriteLine(word);
  13. }

同样它也可以接 lambda 表达式:

  1. public static void Main()
  2. {
  3. char[] separators = new char[] {' '};
  4. Func<string, int, string[]> extract = (s, i) =>
  5. i > 0 ? s.Split(separators, i) : s.Split(separators) ;
  6.  
  7. string title = "The Scarlet Letter";
  8. // Use Func instance to call ExtractWords method and display result
  9. foreach (string word in extract(title, 5))
  10. Console.WriteLine(word);
  11. }

 Func都是有返回类型的,如果我们的方法没有返回类型该怎么办呢?

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

  1. tatic void Main(string[] args)
  2. {
  3. Action say = SayHello;
  4. say();
  5. }
  6. public static void SayHello( )
  7. {
  8. Console.WriteLine("Say Hello");
  9. }

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

  1. static void Main(string[] args)
  2. {
  3. Action<string> say = SayHello;
  4. say("Hello");
  5. }
  6. public static void SayHello(string word )
  7. {
  8. Console.WriteLine(word);
  9. }

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

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

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

匿名方法:

  1. static void Main(string[] args)
  2. {
  3. Action<string> say = delegate(string word)
  4. {
  5. Console.WriteLine(word);
  6. };
  7. say("Hello Word");
  8. }

Lambda表达式:

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

委托----Func和Action的更多相关文章

  1. 委托Func和Action【转】

    平时我们如果要用到委托一般都是先声明一个委托类型,比如: private delegate string Say(); string说明适用于这个委托的方法的返回类型是string类型,委托名Say后 ...

  2. C#学习笔记(30)——系统自带委托Func和Action

    说明(2017-11-23 10:46:33): 1. Func有返回值,Action无返回值,以后就不用定义delegate委托了. 2. 不过还是不知道什么时候该用委托,蒋坤在讲完事件后,留了个作 ...

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

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

  4. Func和Action委托简单用法

    Func和Action类是特殊的类型,它们允许你在不必指定自定义委托类型的情况下,去使用委托.在整个.NET框架中都可以使用它们.例如,在我们考察并行计算时,你也会看到这两个类的示例. 上面一段文字是 ...

  5. c# 委托(Func、Action)

    以前自己写委托都用 delegate, 最近看组里的大佬们都用 Func , 以及 Action 来实现, 代码简洁了不少, 但是看得我晕晕乎乎. 花点时间研究一下,记录一下,以便后期的查阅. 1.F ...

  6. C#委托delegate、Action、Func、predicate 对比用法

    委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递.事件是一种特殊的委托. 一.委托的声明   (1) delegate delegate我们常用到的一种声明 Delega ...

  7. C#常见委托のdelegate定义,Func,Action,Predicate总结

    委托,顾名思义,就是让其他代理,本质就是为具有共性方法组定义一个方法模板:(交流可以加qq群:435226676) 委托常见的方式有一般委托显示定义,Func<T,TResult> (T, ...

  8. 委托, 泛型委托,Func<T>和Action<T>

    使用委托来做一些事情,大致思路是: 1.定义声明一个委托,规定输入参数和输出类型.2.写几个符合委托定义的方法.3.把方法列表赋值给委托4.执行委托 internal delegate int MyD ...

  9. 委托、多播委托、泛型委托Func,Action,Predicate,ExpressionTree

    当试图通过一个事件触发多个方法,抽象出泛型行为的时候,或许可以考虑使用委托.     通过委托构造函数或委托变量把方法赋值给委托 private delegate double DiscountDel ...

随机推荐

  1. 微信现金红包 python

    微信现金红包发送接口,好像没法限制一个用户一个活动只能领取一次红包,在调用红包接口上,自己做了限制 REDPACK_RECORD 建表sql -- Create table create table ...

  2. Python基础(函数部分)-day04

    写在前面 上课第四天,打卡: 加勒比海盗今天上映:端午节公司发的粽子很有范! 一.函数的基本概念 - 函数是什么?  函数,就是一个'锤子',一个具有特定功能的'锤子',使用者可以在适当的时候使用这个 ...

  3. VUE2.0 饿了吗视频学习笔记(五):父子对象传递、显示图片

    一.父子组件之间对象传递 1.app.Vue中的v-header 中加入 v-bind:seller="seller" template> <div id=" ...

  4. Telnet Protocol Specification

    Network Working Group J. Postel Request for Comments: 854 J. Reynolds ISI Obsoletes: NIC 18639 May 1 ...

  5. split('\r\n')

    '\r'是回车,'\n'是换行,前者使光标到行首,后者使光标下移一格.通常用的Enter是两个加起来. 实际我的脚本读取FTP的列表,如果用的split("\r\n"),可以获得正 ...

  6. mysql案例~关于mysql的配置文件个人见解

    mysql 设置参数解读一  mysql的参数分为几类     1 session级别可以设置     2 global级别可以设置     3 session+global级别可以设置     4 ...

  7. mysql 案例~ 主从复制转化为级联复制

    一 需求 mysql 主从复制切换成级联复制二 核心思想 1 开启级联复制 2 确定postion点场景 A->B A-C 三 切换步骤  1 先确定好B为级联复制库  2 B添加log_upd ...

  8. spring整合ehcache2.5.2缓存异常-- net.sf.ehcache.CacheException

    报错如下: The source of the existing CacheManager is: DefaultConfigurationSource [ ehcache.xml or ehcach ...

  9. Java用System读取系统相关信息、环境变量——(六)

    package Java_Test; public class System1 { public static void main(String[] args) { // TODO Auto-gene ...

  10. IP分片丢失重传 - Sacrifice的日志 - 网易博客

        尽管IP分片看起来是是透明的,但有一点让人不想使用它:即使只丢失一片数据也要重传整个数据报.为什么会发生这种情况呢?     因为IP层本身没有超时重传的机制--由更高层来负责超时和重传(TC ...