一篇关于C# Action,Delegate,Func的用法

开发 后端
以前我都是通过定义一个delegate来写委托的,但是最近看一些外国人写的源码都是用action和func方式来写,当时感觉对这很陌生所以看起源码也觉得陌生,所以我就花费时间来学习下这两种方式,然后发现确实代码简洁了不少。

[[399198]]

本文转载自微信公众号「dotNET编程大全」,作者zls365。转载本文请联系dotNET编程大全公众号。

以前我都是通过定义一个delegate来写委托的,但是最近看一些外国人写的源码都是用action和func方式来写,当时感觉对这很陌生所以看起源码也觉得陌生,所以我就花费时间来学习下这两种方式,然后发现确实代码简洁了不少。这两种方式我们也可以去实践的过程去慢慢运用。

先说一下委托:

模拟一下场景:小明最近学习情绪高涨,以前买的书已经满足不了欲望,打算去买本(一个程序员的自我修养)。可是呢以前总是跑书厂买,nm,太远了扛不住,就去跑去附近书店去买,小明去给钱就弄了一本书回来,这个过程就是委托。开始分析

1:小明要买一本一个程序员自我修养的书籍(xx书就不买)硬性要求 (这就是要定义委托性质)

代码:

  1. private delegate void BuyBook(); 

2:附近书店 (委托的方法)

代码:

  1. public static void Book() 
  2.     Console.WriteLine("我是提供书籍的"); 

3:小明和书店建立关系(给委托绑定方法)

代码:

  1. BuyBook buybook = new BuyBook(Book); 

4:小明给钱拿书(触发)

  1. buybook(); 

上面的内容是为了能理解委托的用法下面呢我开始讲解Action和Func

Action的用法

1:小明很是苦恼,我就是买一本书籍,每次都让我定义下,烦死了,有没有一种方法不去定义委托呢,那么有吗,还真有,就是我们今天讲的Action

  1. Action BookAction = new Action(Book); 
  2.  
  3. BookAction(); 

这样是不是就简单了很多

2:小明现在又不满意了,我把一个程序员的自我修养看完了,现在呢想买本其他书,那怎么办,我是不是要重新再次定义委托。其实不需要你只需要把参数穿过来就可以了。下面我们看Action的用法

  1. static void Main(string[] args) 
  2.         { 
  3.             Action<string> BookAction = new Action<string>(Book); 
  4.             BookAction("百年孤独"); 
  5.         } 
  6.   
  7.         public static void Book(string BookName) 
  8.         { 
  9.             Console.WriteLine("我是买书的是:{0}",BookName); 
  10.         } 

3:现在小明又改变主意了,我不仅要自己选择书籍,我还要在一个牛逼的书籍厂家买,有没有这种方式呢,那么告诉你有,Action

  1. static void Main(string[] args) 
  2.         { 
  3.             Action<string,string> BookAction = new Action<string,string>(Book); 
  4.             BookAction("百年孤独","北京大书店"); 
  5.         } 
  6.   
  7.         public static void Book(string BookName,string ChangJia) 
  8.         { 
  9.             Console.WriteLine("我是买书的是:{0}来自{1}",BookName,ChangJia); 
  10.         } 

Func的用法

小明又发生疑问了,每次我自己都去书店去拿书,有没有一种方法直接送到我家里呢,那么Func专门提供了这样的服务

Func 解释 封装一个不定具有参数(也许没有)但却返回 TResult 参数指定的类型值的方法。

1:我们先看一个没有参数只有返回值的方法

  1. static void Main(string[] args) 
  2.         { 
  3.             Func<string> RetBook = new Func<string>(FuncBook); 
  4.             Console.WriteLine(RetBook); 
  5.         } 
  6.   
  7.         public static string FuncBook() 
  8.         { 
  9.             return "送书来了"
  10.         } 

2:有参数有返回值的方法

  1. static void Main(string[] args) 
  2.     Func<string,string> RetBook = new Func<string,string>(FuncBook); 
  3.     Console.WriteLine(RetBook("aaa")); 
  4.   
  5. public static string FuncBook(string BookName) 
  6.     return BookName; 

3:Func一个很重要的用处就是传递值,下面我举一个简单的代码来说明

  1. Func<string> funcValue = delegate 
  2.             { 
  3.                 return "我是即将传递的值3"
  4.             }; 
  5.   
  6.             DisPlayValue(funcValue); 

注释1:DisplayVaue是处理传来的值,比喻缓存的处理,或者统一添加数据库等

  1. private static void DisPlayValue(Func<string> func) 
  2.             string RetFunc = func(); 
  3.             Console.WriteLine("我在测试一下传过来值:{0}",RetFunc); 
  4.         } 

总结

1:Action用于没有返回值的方法(参数可以根据自己情况进行传递)

2:Func恰恰相反用于有返回值的方法(同样参数根据自己情况情况)

3:记住无返回就用action,有返回就用Func

 

责任编辑:武晓燕 来源: dotNET编程大全
相关推荐

2021-12-09 07:13:25

C#集合类型

2009-08-27 16:11:03

C# delegateC# event

2009-08-25 10:24:29

C# delegate

2021-09-15 19:05:16

数据开源项目

2009-08-19 14:29:33

C#代理

2021-04-15 05:53:35

C# 索引器对象

2021-10-11 11:08:33

HDFS快照系统

2021-11-09 12:11:55

C# Redis队列

2021-05-14 16:34:12

Semaphore原理

2021-08-27 07:47:06

SQL静态程序

2021-09-05 07:55:36

Lsm核心实现

2022-05-08 19:58:10

JSONPJavaScript

2021-08-12 07:49:24

SQL递归用法

2022-04-02 09:38:00

CSS3flex布局方式

2021-07-12 10:36:36

Blazor组件入门

2022-11-08 10:52:25

Flowable节点表单

2021-09-08 09:22:34

SentryCLIOS

2021-04-18 18:03:06

工作树远程版本

2022-07-06 08:17:50

C 语言函数选型

2021-08-02 10:01:09

Iterator接口Java项目开发
点赞
收藏

51CTO技术栈公众号