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

上面一段文字是官方的一段翻译。虽然看上去你不太容易能理解是什么意思。的确委托糅合C#的很多概念在里面,一时半会要真正理解其含义用途不是一件现实的事情。说实在的,我也是经历很长的时间才理解委托的用途的,虽然不太全面。

网上关于C#委托的文章很多,大多数都只是说清楚了如何使用委托,但并未解释为什么它们是有用的。当然这篇文章也只是介绍Func和Action的简单用法,如果你想对委托有更深刻的理解,我推荐看看这篇文章 http://www.cnblogs.com/r01cn/archive/2012/11/30/2795977.html

还是用简单的语法快速地学会在C#中如何使用Action和Func。(看完之后,比你想象中要简单N倍)

Action的用法

我们定义没有返回值没有参数的委托这样的:

   private delegate void EatRice(); //定义一个eatrice委托类型

写一个无返回值无参数的函数:

        private static void  Eat()
{
Console.WriteLine("我吃饭了");
}

然后声明并调用:

        static void Main(string[] args)
{
EatRice eatRice =Eat;//实例化委托类型
eatRice();//调用委托
}

问题来了:有没有办法不定义委托,直接调用呢?当然是可以的,直接用Action

Action是.net 内置的委托(F12之后有种被骗的感觉),有很16个重载,低版本好像没这么多

        static void Main(string[] args)
{
Action eat = Eat;
eat();
}
private static void Eat()
{
Console.WriteLine("我吃饭了");
}

还有Action<T> 委托,说是有16个“重载”(其实这种说法不正确),也就是可以最多可以接收16个 T类型的参数

演示一下Action<T,T> 接收两个T类型的参数委托(Action的委托重点是一定没有返回值类型)

        static void Main(string[] args)
{
Action<int ,string> eat = Eat;
eat(5,"苹果");
}
private static void Eat(int num,string name)
{
Console.WriteLine($"我吃了{num}个{name}");
}

我们F12转到定义看看,结果有点失望,原来也就是用delegate 关键字定义一个Action的名称。国际惯例,还是发张图

可以接匿名函数使用吗?当然是可以的, lambda表达式也是可以的

        static void Main(string[] args)
{
Action<int ,string> eat = delegate(int x,string name) {
Console.WriteLine($"我吃饭{x}个{name}");
};
eat(5,"苹果");
}

lambda表达式:

     Action<int, string> eat = (num, name) =>
{
Console.WriteLine($"我吃饭{num}个{name}");
};
eat(5,"苹果");

虽然上面只是告诉我们Action如何使用,但是并没有说明它的作用体现在哪里。写一个发送请求的方法你就会知道它是有作用的

        static void Main(string[] args)
{
sendPost(success => { Console.WriteLine(success); },//实现响应成功做哪些事情
errorAction => { Console.WriteLine(errorAction); });//实现失败做哪些事情
}
private static void sendPost(Action<string> errorAction,Action<string> successAction)
{ bool resSuccess = true;//发送请求,接收数据是否成功
string errorCode = "1004";
if (resSuccess)
{
successAction("响应成功");
}
else
{
errorAction("响应失败,errorCode"+errorCode);
}

使用发送请求方法的时候,将Action委托作为参数去实现。这有点类似jquery的ajax 方法 error,success去回调。

Action 的委托没有返回值,那要是有返回值的函数怎么做,恰恰相反Func就是专门解决这样一个事情的必须有返回值参数(0-16 T类型参数)

Func的用法

在不使用Func委托时我们来写一个计算两个int类型乘积的委托返回值是int。

        private delegate int Calc(int a,int b); //定义一个Calc委托类型 ,计算a*b
static void Main(string[] args)
{
Calc calc = calcMul;//实例化委托
Console.WriteLine(calc(10,12)); //调用委托
}
private static int calcMul(int a ,int b)
{
return a * b;
}

不使用delegate关键字声明委托直接使用内置写好的Func关键字这样就OK了。

        static void Main(string[] args)
{
Func<int, int, int> calc = calcMul;
Console.WriteLine( calc(12,45));
}
private static int calcMul(int a ,int b)
{
return a * b;
}

Func至少有一个T类型参数作为返回值。规定是将最后一个参数作为返回值。

Func结合匿名方法和lambda表达式也是可以的。

        static void Main(string[] args)
{
Func<int, int, int> calc = delegate (int x, int y)
{
return x * y;
};
Console.WriteLine(calc(10,45));
}

lambda表达式:

     static void Main(string[] args)
{
Func<int, int, int> calc =(x,y)=>
{
return x * y;
};
Console.WriteLine(calc(10,45));
}

至于Func为什么是很有作用,这个就不多写了,和Action差不多,委托还需要在实践中不断使用,就会发现这两个玩意的经典之处。

的确,是不是比想象中要简单许多。.net 中随处可见委托,不会玩委托真的挺尴尬的。写的有点杂,没有说到的地方,还请各位见谅。

作者:张林

标题: 原文地址:http://blog.csdn.net/kebi007/article/details/69367562

转载随意注明出处

Func和Action委托简单用法的更多相关文章

  1. Func 和 Action 委托

    有了泛型委托,就有了一能适用于任何返回类型和任意参数(类型和合理的个数)的通用委托,Func 和 Action.如下所示(下面的in表示参数,out表示返回结果): delegate TResult ...

  2. 回炉重造系列-C# func and action委托是什么?

    如题: C# func and action委托是什么? 1) 回答这个问题之前,我们需要了解什么是委托(英文 Delegate )? 为了便于理解,再往前推一步,回到c语言时代,指针的概念. 什么是 ...

  3. func 和action 委托的使用

    func 可以带返回值,action  不带返回值 平时我们如果要用到委托一般都是先声明一个委托类型,比如: private delegate string Say(); string说明适用于这个委 ...

  4. C#内置委托类型Func和Action对比及用法

    C#的内置委托类型 Func Action 返回值 有(只有一个Tresult) 无 重载 17个(0参-16参) 17个(0参-16参) 泛型 支持 支持 系统内置 是 是 是否需要声明 否 否 c ...

  5. 委托代码func和Action的基本用法

    这是微软简化后的委托写法,其中,func适合带返回参数的方法调用,action适合没有返回参数的方法调用 FUNC方法代码: public string GetPeopleInfo(string na ...

  6. C#中常见的委托(Func委托、Action委托、Predicate委托)

    今天我要说的是C#中的三种委托方式:Func委托,Action委托,Predicate委托以及这三种委托的常见使用场景. Func,Action,Predicate全面解析 首先来说明Func委托,通 ...

  7. Func和Action的用法区别

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

  8. 委托Func和Action【转】

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

  9. 委托(Func与Action)

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

随机推荐

  1. 关于HTML5新手应该知道的几点知识

    随着移动互联网的快速发展,HTML5迅速崛起,我们的生活的方方面面都被HTML5渗透着.HTML5在PC端.移动端上均应用广泛,被称为Web的未来.而随着Google正式停止支持Swiffy,HTML ...

  2. 十、Hadoop学习笔记————Hive与Hbase以及RDBMS(关系型数据库)的关系

    Hive目的是为了简化MapReduce编程 实际应用中,Hive与Hbase不经常链接

  3. CNCC2017中的深度学习与跨媒体智能

    CNCC2017中的深度学习与跨媒体智能 转载请注明作者:梦里茶 目录 机器学习与跨媒体智能 传统方法与深度学习 图像分割 小数据集下的深度学习 语音前沿技术 生成模型 基于贝叶斯的视觉信息编解码 珠 ...

  4. gulp 小坑一个

    学习gulp的时候,看到很多人写到 gulp.task('styles', function() { return gulp.src('src/styles/main.scss') .pipe(sas ...

  5. JS 中对变量类型的五种判断方法

    5种基本数据类型:undefined.null.boolean.unmber.string 复杂数据类型:object. object:array.function.date等 方法一:使用typeo ...

  6. 【luogu P1186】玛丽卡

    https://www.luogu.org/problem/show?pid=1186 考虑暴力,枚举图上每一条边删去后跑Dijkstra,取M次的最大值. 仔细想想就会发现删除最短路以外的边对最短路 ...

  7. c++简单编写线性表(实验)

    哇 好久没更博客了  因为从上次更文到现在为止,我一直在学c#,然后也觉得没什么太大的东西想写在博客上, 总之这次就简单的传一下学校安排的数据结构的实验,我还是学生,是新手,希望能继续跟大家一起学习, ...

  8. 从Windows迁移SQL Server到Linux

    前一篇博客关于SQL Server on Linux的安装,地址:http://www.cnblogs.com/fishparadise/p/8057650.html,现在测试把Windows平台下的 ...

  9. 逐步搭建Lamp环境之Linux的运行模式

    首先先来看几个概念,分别是:单用户.单任务.多用户.多任务 单用户: 是指操作系统一般只能由一个人同时进行登录 单任务: 是指操作系统只能同时处理一个任务 多用户: 是指操作系统可以允许由多个用户同时 ...

  10. MySQL安装出现的1045问题以及解决方法

    MySQL安装出现1045的问题解决办法: 1045.的原因是已经装过了MySQL再次装的时候报的错误,那么该怎么处理那??? 首先卸载程序,从windows里找到mysql右击卸载,然后就是在dos ...