更新时间:2021-12-11 19:37:46
Func和Action类是特殊的类型,它们允许你在不必指定自定义委托类型的情况下,去使用委托。在整个.NET框架中都可以使用它们。例如,在我们考察并行计算时,你也会看到这两个类的示例。
上面一段文字是官方的一段翻译。虽然看上去你不太容易能理解是什么意思。的确委托糅合C#的很多概念在里面,一时半会要真正理解其含义用途不是一件现实的事情。说实在的,我也是经历很长的时间才理解委托的用途的,虽然不太全面。
网上关于C#委托的文章很多,大多数都只是说清楚了如何使用委托,但并未解释为什么它们是有用的。当然这篇文章也只是介绍Func和Action的简单用法,如果你想对委托有更深刻的理解,我推荐看看这篇文章 http://www.cnblogs.com/r01cn/archive/2012/11/30/2795977.html
还是用简单的语法快速地学会在C#中如何使用Action和Func。(看完之后,比你想象中要简单N倍)
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("我吃饭了"); }
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,"苹果");
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类型参数)
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; }
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类型参数作为返回值。规定是将最后一个参数作为返回值。
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)); }
的确,是不是比想象中要简单许多。.net 中随处可见委托,不会玩委托真的挺尴尬的。写的有点杂,没有说到的地方,还请各位见谅。
作者:张林
标题: 原文地址:http://blog.csdn.net/kebi007/article/details/69367562
转载随意注明出处