[代码]--C#action和func的使用
以前我都是通过定义一个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();
上面的内容是为了能理解委托的用法下面呢我开始讲解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);
}
总结
1:Action用于没有返回值的方法(参数可以根据自己情况进行传递)
2:Func恰恰相反用于有返回值的方法(同样参数根据自己情况情况)
3:记住无返回就用action,有返回就用Func
原地址:https://www.cnblogs.com/xuxiaoshuan/p/6844511.html
[代码]--C#action和func的使用的更多相关文章
- Delegate、Predicate、Action和Func
写在前面 Delegate Predicate Action Func 逆变和协变 先说下什么是委托(Delegate),委托在C#中是一种类型,和Class是一个级别,但是我们经常把它看做是一个方法 ...
- VS2012 Unit Test(Void, Action, Func) —— 对无返回值、使用Action或Func作为参数、多重载的方法进行单元测试
[提示] 1. 阅读文本前希望您具备如下知识:了解单元测试,了解Dynamic,熟悉泛型(协变与逆变)和Lambda,熟悉.NET Framework提供的 Action与Func委托.2.如果您对单 ...
- C#系统委托之Action And Func
Action Action<T> Func Func<T> Action:封装一个方法,该方法不具有参数并且不返回值 public delegate void Action() ...
- Action<>和Func<> 委托【代理】
C#中的Action<>和Func<> 其实他们两个都是委托[代理]的简写形式. 一.[action<>]指定那些只有输入参数,没有返回值的委托 Delegate的 ...
- .NET中的Action及Func泛型委托
委托,在C#编程中占有极其重要的地位,委托可以将函数封装到委托对象中,并且多个委托可以合并为一个委托,委托对象则可以像普通对象一样被存储.传递,之后在任何时刻进行调用,因此,C#中函数回调机制的实现基 ...
- 使用.NET中的Action及Func泛型委托
委托,在C#编程中占有极其重要的地位,委托可以将函数封装到委托对象中,并且多个委托可以合并为一个委托,委托对象则可以像普通对象一样被存储.传递,之后在任何时刻进行调用,因此,C#中函数回调 ...
- Action 和 Func
C# 中的两个动态委托类型 也就是说我们不用在使用委托的时候就去声明一个委托对象,而是通过Action和Func就可以模拟出我们自己要用到的委托 区别: Action 表示没有返回值的委托 例如:A ...
- 委托学习续:Action、Func和Predicate
我们先看一个上一章的委托的例子: using System; using System.Collections.Generic; using System.Linq; using System.Tex ...
- 对无返回值、使用Action或Func作为参数、多重载的方法进行单元测试
VS2012 Unit Test(Void, Action, Func) —— 对无返回值.使用Action或Func作为参数.多重载的方法进行单元测试 [提示] 1. 阅读文本前希望您具备如下知识: ...
随机推荐
- 【ZOJ 3463】Piano
ZOJ 3463 题意:有一个钢琴,一个人把左手放在L位置上,右手放在R位置上,要弹某\(n\)个键,每个手最多能够得着9个位置,并且两只手不能交叉.把手移动的代价是大拇指移动的距离的平方根.问弹完这 ...
- Redis 安装部署
1. 官网(https://redis.io/download)下载稳定版安装包 3.0.7或3.2或4.1; 2. 复制到部署服务器 /opt/redis4,解压 tar zxvf redis-4. ...
- 交换左Ctrl键和Caps lock键
Windows 10 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control ...
- 内核里面writel(readl)是如何实现的
writel和readl,这两个个函数实现在操作系统层,有内存保护的情况下,往一个寄存器或者内存地址写一个数据.先说一下writel: 在arch/alpha/kernel/io.c中有 void ...
- Cordova套网站
用Cordova套网站,只修改Content的话,打包后的App,在点击后会打开浏览器,并没有在App中显示内容. 需要设置allow-navigation为 * <?xml version=' ...
- Redis对象占用内存分析
当你往Redis中插入了一系统对象,如何分析这些对象的占用情况? 1.我们可以在Redis的控制台使用info命令来查看各项指标,其中有一项是Memory,可以通过存储前后的used_memory差异 ...
- C#基础巩固(1)-多态+简单工厂
多态 如果要简要的描述多态的话,我个人是这样理解的:通过继承,父类定义方法,具休的实现由子类进行. 01代码 //父类 class Person { public virtual void skill ...
- BZOJ 4804: 欧拉心算
数论题不多BB,直接开始推导吧: \(\sum_{i=1}^n \sum_{j=1}^n \phi(gcd(i,j))\) \(=\sum_{i=1}^n \sum_{j=1}^n \sum_{d=1 ...
- 【调试技巧】 Fiddler高级用法之url映射请求
问题场景: 已发布线上APP出现接口错误,如何测试线上APP访问本地请求? 已发布线上H5页面,静态资源或js调试,如何映射本地js? 一般解决方案: 猜测(一般明显问题). 找到原发布包,修改请求资 ...
- zookeeper 动态管理nginx配置
假设我们有一个场景,所有服务器共享同一份配置文件,我们肯定不可能单独手动维护每台服务器,这时可以利用zookeeper的配置管理功能. 环境:python + nginx + zookeeper 目的 ...