一、Func

Func是一个.Net内置的委托。

Func<Result>,Func<T1,Result>是一个.Net内置的泛型委托。

  • Func<TResult>
  • Func<T,TResult>
  • Func<T1,T2,TResult>
  • Func<T1,T2,T3,TResult>
  • Func<T1,T2,T3,T4,TResult>

它有5种形式,只是参数个数不同;第一个是无参数,但是有返回值;

下面是一个简单的普通委托来传方法的示例。

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

所以,在有时候,我们不知道一个接口同时要做什么操作的时候,我可以给它留一个委托。

为了更方便,.Net直接默认有了委托。我们再来试试.Net默认带的委托。

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

如果需要参数的,还可以这样传一份。

        public static string SayHello(string str)
{
return str + str;
} static void Main(string[] args)
{
Func<string, string> say = SayHello;
string str = say("abc");
Console.WriteLine(str); //输出abcabc
Console.ReadKey();
}

二、Action

Action<T>的用法与Func几乎一样,调用方法也类似。

  • Action
  • Action<T>
  • Action<T1,T2>
  • Action<T1,T2,T3>
  • Action<T1,T2,T3,T4>
        private delegate string Say();
public static void SayHello(string str)
{
Console.WriteLine(str);
} static void Main(string[] args)
{
Action<string> say = SayHello;
say("abc");
Console.ReadKey();
}

三、Func与Action的区别

Func与Action作用几乎一样。只是

  • Func<Result>有返回类型;
  • Action<T>只有参数类型,不能传返回类型。所以Action<T>的委托函数都是没有返回值的。

四、Func与Action都支持Lambda的形式调用

还是以一个输入后,返回重复一次的值作为示例。

Func<string, string> say = m => m + m;
Console.WriteLine(say("abc"));    //输出abcabc

五、最常见到Func的地方

通常我们最常见到Func是在方法的参数里如下面这样:

string XXX(Func<string, string>)

咱们来看看Linq里面的其中一个Sum:

public static int Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, int> selector);

里面看到两点:
1、扩展方法,与这篇文章无关(扩展的是IEnumerable<TSource>,主要是为了能够实现IEnumerable<TSource>接口的集合.出函数)。
2、Func<TSource, int> selector这个参数。
尝试写一个Linq的First函数吧,命名为First2。Linq源代码里有很多异常情况处理,好多设计模式,可惜我不懂,只提取简单逻辑了。

namespace ConsoleApplication2
{
static class Extend
{
public static TSource First2<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
//.Net本身的源代码好多异常情况处理,好多设计模式,我也不懂,只提取逻辑
foreach (TSource item in source)
{
if (predicate(item))
{
return (item);
}
}
throw new Exception("不存在满足条件的第一个元素!");
}
} class Program
{
static void Main(string[] args)
{
List<int> ListInt = new List<int>(){ 1, 2, 3, 4, 5 };
int k = ListInt.First2(m => m > 4); //输出5
Console.WriteLine(k); Console.ReadKey();
}
}
}

  

Func<T>、Action<T> 的区别于说明的更多相关文章

  1. Func和Action的用法区别

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

  2. 通过IL分析C#中的委托、事件、Func、Action、Predicate之间的区别与联系

    先说一下个人理解的结论吧: delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类. delegate声明的变量与delegate声明的事件,并没有本质的区别,事件是在dele ...

  3. Delegate,Action,Func,Predicate的使用与区别

    C#4.0推出后,类似Linq,Lamda表达式等许多新的程序写法层次不穷.与之相关的Delegate,Action,Func,Predicate的使用和区别也常常让大家迷惑,此处就结合实际的应用,对 ...

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

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

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

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

  6. .NET自带泛型委托方法Func、Action和Predicate

    Func.Action和Predicate是.NET自带的3个泛型委托方法,三个方法的区别其实并不大,要强行给混着用也是可以的,但是我们是有追求的人,把道理讲清楚总是好的. 一.Func是有返回值的方 ...

  7. Func,Action 的介绍

    Func,Action 的介绍 Func是一种委托,这是在3.5里面新增的,2.0里面我们使用委托是用Delegate,Func位于System.Core命名空间下,使用委托可以提升效率,例如在反射中 ...

  8. Func和Action委托简单用法

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

  9. c# 委托(Func、Action)

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

随机推荐

  1. CentOS 7 安装 WordPress,PHP,Nginx,MySQL(MariaDB),FTP

    主要资料参考:https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-st ...

  2. P1834 种花小游戏

    我只是想做壮鸭低劈啊,为什么只有状压没有DP-- 原题: 植物大战僵尸这款游戏中,还有个特别有意思的赚钱方式--种花(能长金币的花).种出来的金币需要玩家点击才能得到,或者,玩家可以购买一只蜗牛来帮助 ...

  3. Single Number

    Given an array of integers, every element appears twice except for one. Find that single one.Your al ...

  4. OC 相关

    1.OC runtime的理解[转载] http://www.csdn.net/article/2015-07-06/2825133-objective-c-runtime/1

  5. sql查询语句

    //查询表的字段名和字段类型select column_name,data_type from information_schema.columns where table_name = '表名' / ...

  6. fastdfs 安装配置

      介绍文档   1.安装 # wget # tar xf download # cd FastDFS/ # ./make.sh 运行文件 有报错信息 compilation terminated. ...

  7. JAVA课程体系

    文件流 单点登录 maven.maven私服 jenkins 小程序 支付 webservice/webapi redis 工作流 权限:shiro 高并发 springBoot dubbo 消息推送 ...

  8. centos虚拟机网络配置

    修改IP vi /etc/sysconfig/network-scripts/ifcfg-eth0 ONBOOT=yes BOOTPROTO=dhcp service network restart ...

  9. winform中设置窗体的默认焦点

    winform的窗体中,有时候需要设置默认焦点,有时候需要取消默认焦点. 设置默认焦点,最简单的方法就是设置这个控件的tabIndex,例:textBox1.TabIndex = 0; 也可以在窗体事 ...

  10. vmware12无法打开内核设备“\\.\Global\vmx86”

    vmware12 无法打开内核设备"\\.\Global\vmx86": 系统找不到指定的文件.你想要在安装 VMware Workstation 前重启吗? 打开vmware12 ...