详解Func与Action区别
func<t>、action<t> 的区别于说明
一、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(); } } }
以上所述是本文的全部内容,有问题的可以和小编联系,谢谢对的支持!
上一篇: WPF实现简单的跑马灯效果