本文转载自微信公众号「dotNET编程大全」,作者zls365。转载本文请联系dotNET编程大全公众号。
以前我都是通过定义一个delegate来写委托的,但是最近看一些外国人写的源码都是用action和func方式来写,当时感觉对这很陌生所以看起z c M w Z Y ^ N源码也觉得陌生,所以我就花费时间来学习下这两种方式,然后发现确实代码简洁了不少。这两种方式我们也可以去实践的过程去慢慢运用。
先说一下委托:
模拟一下场景:小明最近学习情绪高涨,以前l T ? y k [买的书已经满足不了欲望,打算去买本(一个程序员的自我修养)。可是呢以前总是跑书厂买,nm,太远了扛不住,就去跑去附近书店去买,小明去给钱就弄了一本书回来,这个过程就是委C N 5托。开始分析
1:小明要买一本一个程序员自我修养的书籍(xx书就不买)硬性要求 (这就是要定义委托性质)
代码:
- privatedelegate& ; { S ,voidBuyBook();
2:附近书店 (委托的方法)
代码:
- publicstatiF V $ [ vcvoidBook()
- {
- Console.WriteLine("我是提供书籍的");
- }
3:小明和书店建立关系(给委托绑定方法)
代码:
- BuyBookbuC y : v C yybook=newBuyBook(Book);
4:小明给钱拿书(触发)
- buybook()U & G ) p $ , a;
上面的内容是为了能理解委托的用法下面呢我开始讲解Action和Func
Action的用法
1:小明很是苦恼,我就是买P + E 7一本书籍K , ? ` y L h .,每次都让我定义下,烦死了,有没有一种方法不去定义委托呢,那么有吗,还真有,就0 Y h是我们今天讲的Action
- ActionBQ m m D G DookAction=newAction(Book);
- BookAction();
这样是不是就简单了很多
2:小明现在又不满意了,我把一个程序员的自我修养看D g n T完了,现在呢想买本其他书,那怎么办4 ] f z N T,我是不是要重新再次定义委托。其实不需要你| r R V = F z ^ ^只需要把参数穿过来就可以了。下面我们看Action的用法
- staticvoidMain(string[]args)
- {
- ActF J 7 Y [ Y o cion<string>BookAction=newActij f | @ 6 h _ qon<string>Z 1 + B;(Book);
- BookAction("百年孤独");
- }
- publicsW G 1 n r {taticvoidBook(stringBookNamV : \e)
- {
- Console.WriteLine("我是买书的是:{0}",BookName);
- }
3:现在小明又改变主意了,我不仅要自己选择书籍,我还要在一个牛逼的书籍厂家买,有没有这种方式呢,那么告诉你有,Action
- staticvoidMain(s0 = u 4 ^ , utrT ! _ k Cing[]args)
- {
- Action<string,string>Book] N P 4 : |Action=newActio% H Zn<striy T *ng,string>(Book);
- BookAction("百年孤独","北京大书店");
- }
- publicstaticvoidBook(stringBookName,stringChangJia)
- {
- Console.WF a 6 ^ g ` K # XriteLine("我是买书的是:{0}来自{1}",BookName,ChangJia);
- }
Func的用法
小明又发生疑问了,每次我自己都去书店去拿书,有没有一种方法直C v . Q (接送到我家里呢,那么Func专门提供了这样的服务
Func 解释 封装一个不定具有参数(也许没有)但却返回 TResult 参数指定的类型值的T q L + O X / ,方法。
1:我们先看一个没有参数只有返回值的方法
- staticvoidMain(string[]args)
- {
- Func<string>RetBook=newFunc<string>(FuncBook! 1 ] I t q = Q);
- Console.WJ , ) Q f (riteLine(RetBook);
- }
- publiM z z 5 p g . ) ]cstat~ \ OicstringFuncBook()
- {
- return"送书来了";
- }
2:有m x n参数有返回值的方法
- staticvoidMain(sB b # b X V N Ptring[]args)
- {
- Func<string,string>RetBook=nc ~ ( h T , }ewFunc&l& G q ?t;string,string>(FuncBook);
- Console.WriteLine(Rg B E 4 ^etBook("aa$ 8 l n va"));
- }
- publicstaticstringFuncBook(stringBookName)
- {
- returnBookName;
- }
3:Func一个# d ~ j \ v N很重– z ? ^ 4 k要的用处就是传递值,下面我举一个简单的代码来说明
- Func<string>funcValuU Q X ? - i | fe=delegate
- {
- rL ~ T Aeturn"我是V ^ m H x C ~ 7即将传递的值3";
- }X P 9 [ ` t 1 C;
- DisPlayValue(funcValue);
注释1:DisplayVaue是处理传来的值,比喻缓存的处理,或者统一添加e 1 j D [ 7数据库等
- privatestaticvoidDisPlayValue(Func<string>func)
- {
- stringRetFunc=func();
- Console.WriD R , ? G : #t! Q c D & M e ^eLine("我在测试一下传过来值:{0}",RetFunc);
- }
总结
1:Action用于没有返回值的方法(参数可以根据自己情况进行传递)
2:Func恰恰相反用于有返回值的方法(同样参数根据自己情况情况)
3:记住无返回就用action,有返回就用Func