此篇文章一部分为转载,一部分为原创

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

先说一下委托:

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

开始分析:

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

代码:

 private delegate void BuyBook();

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

代码:

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

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

代码:

 BuyBook buybook = new BuyBook(Book);

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

buybook();

如果还是不能理解委托,可以查看我的另一篇文章 C# 委托和事件 详解

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

Action的用法

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

Action BookAction = new Action(Book);
BookAction();

这样是不是就简单了很多

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

static void Main(string[] args)
{Action<string> BookAction = new Action<string>(Book);BookAction("百年孤独");
}
public static void Book(string BookName)
{Console.WriteLine("我是买书的是:{0}",BookName);
}

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

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

Func的用法

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

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

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

static void Main(string[] args)
{Func<string> RetBook = new Func<string>(FuncBook);Console.WriteLine(RetBook);
}
public static string FuncBook()
{return "送书来了";
}

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

static void Main(string[] args)
{Func<string,string> RetBook = new Func<string,string>(FuncBook);Console.WriteLine(RetBook("aaa"));
}
public static string FuncBook(string BookName)
{return BookName;
}

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

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

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

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

附上一则实例:

using System;
namespace DelegateFuncAction
{class Program{static void Main(string[] args){Func<double, double,double> DoAddtion = calculate.addtion;double result = DoAddtion(20, 30);Console.WriteLine("Func带返回参数委托做加法结果为:{0}",DoAddtion(10,20));calculate c=new calculate();Action<double, double> DoSubstraction = c.substraction;DoSubstraction(90, 20);}}class calculate{public static double addtion(double x, double y){return x + y;}public void substraction(double x, double y){Console.WriteLine("Action不带返回参数委托做减法结果为:{0}",x-y);}}
}

输出结果:

Func带返回参数做加法结果为:30

Action不带返回参数委托做减法结果为:70

总结

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

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

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

原文链接:https://www.cnblogs.com/LipeiNet/p/4694225.html

感谢原博主!

C# Action和Func的用法详解相关推荐

  1. Ext.Net学习笔记22:Ext.Net Tree 用法详解

    上面的图片是一个简单的树,使用Ext.Net来创建这样的树结构非常简单,代码如下: <ext:TreePanel runat="server"><Root> ...

  2. ios开发读取剪切板的内容_iOS中管理剪切板的UIPasteboard粘贴板类用法详解

    一.自带剪切板操作的原生UI控件在iOS的UI系统中,有3个控件自带剪切板操作,分别是UITextField.UITextView与UIWebView.在这些控件的文字交互处进行长按手势可以在屏幕视图 ...

  3. Linux下的awk用法详解

    Linux下的awk用法详解 一.awk介绍 二.awk的语法 三.awk常见用法 四.awk其他用法 五.awk语言特性 一.awk介绍 1.AWK 是一种处理文本文件的语言,是一个强大的文本分析工 ...

  4. jQuery 表单验证插件,jQuery Validation Engine用法详解

    jQuery 表单验证插件,jQuery Validation Engine用法详解 功能强大的 jQuery 表单验证插件,适用于日常的 E-mail.电话号码.网址等验证及 Ajax 验证,除自身 ...

  5. 教程-Delphi中Spcomm使用属性及用法详解

    Delphi中Spcomm使用属性及用法详解 Delphi是一种具有 功能强大.简便易用和代码执行速度快等优点的可视化快速应用开发工具,它在构架企业信息系统方面发挥着越来越重要的作用,许多程序员愿意选 ...

  6. this指针用法详解

    C++中this指针的用法详解 2010-11-12 20:40:45 分类: C/C++ 1. this指针的用处: 一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果 ...

  7. python中递归函数写法_python递归函数用法详解

    上期我们介绍了函数式编程,这期内容就是关于递归的函数内容,本期还是按照老规矩,给大家进行核心整理,内容通俗易懂,搭配实际应用,以供大家理解. 关于递归: 百度解释:是指函数/过程/子程序在运行过程序中 ...

  8. getordefault java_Java map.getOrDefault()方法的用法详解

    Map.getOrDefault(Object key, V defaultValue)方法的作用是: 当Map集合中有这个key时,就使用这个key值: 如果没有就使用默认值defaultValue ...

  9. android butterknife 自定义view,ButterKnife用法详解.md

    # ButterKnife用法详解 ### 如何成为T型人才,垂直在一个行业中,必须要有一整套[知识体系](https://github.com/WeiSmart/Android-Advanced-C ...

最新文章

  1. python爬虫怎么爬同一个网站的多页数据-请问爬虫如何爬取动态页面的内容?
  2. dann的alpha torch_一图解密AlphaZero(附Pytorch实践)
  3. shields 徽标_所有徽标看起来都一样
  4. SPOJ 3267: DQUERY 树状数组,离线算法
  5. 3 操作系统第二章 进程管理 进程定义、特征、组织、状态与转换
  6. Angular CLI 安装
  7. (10)Verilog HDL异步复位同步释放
  8. leetcode题解25-K个一组翻转链表
  9. Java学习总结(随笔)——利用JSON解析实现网络下载
  10. Thinkpad SL400安装黑苹果10.8.4全纪录
  11. show tables mysql_MySQL_解析MYSQL显示表信息的方法,在用mysql时(show tables),有时候 - phpStudy...
  12. 关于渗透测试以及网络安全法
  13. gltf、glb模型下载
  14. 2017年人工智能十大关键词!
  15. 苹果计算机cpu 型号怎么看,MacBook苹果电脑怎么查看cpu型号等配置详情
  16. linux 移动硬盘 mac,Macbook pro使用原生EFI在移动硬盘安装Windows+Fedora双系统
  17. 手机java时代浏览器_巅峰之战 三款最热java手机浏览器横评
  18. java chr()_chr码值对应列表大全
  19. 【前端前沿看点】React和Vue深度对比
  20. Arduino基础项目十四:红外对管模块

热门文章

  1. html whitespace属性,不简单的 white-space 属性
  2. php中post是什么意思,php中post的用法是什么
  3. 【IT名人堂】何云飞:阿里云数据库的架构演进之路
  4. APEX包管理器简述(一)
  5. 对不起,你拨打的用户已结婚
  6. html5拖动鼠标直线,html5的鼠标拖拽
  7. Android 集成facebook授权登录以及过程中登录错误,密钥散列不匹配
  8. Wiznet W5300 FPGA 控制程序
  9. nextval mysql_mysql实现nextVal功能
  10. Thawte的单域名SSL证书和泛域名SSL证书