C# Action和Func委托
2017-07-29 16:18
113 查看
简单理解:Action和Func都可以实现委托,Action是无返回值的委托,Func是有返回值的委托。
代码:
以下内容完全转载至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
这样是不是就简单了很多
2:小明现在又不满意了,我把一个程序员的自我修养看完了,现在呢想买本其他书,那怎么办,我是不是要重新再次定义委托。其实不需要你只需要把参数穿过来就可以了。下面我们看Action<T>的用法
3:现在小明又改变主意了,我不仅要自己选择书籍,我还要在一个牛逼的书籍厂家买,有没有这种方式呢,那么告诉你有,Action<in T1,in T2>
Func的用法
小明又发生疑问了,每次我自己都去书店去拿书,有没有一种方法直接送到我家里呢,那么Func专门提供了这样的服务
Func 解释 封装一个不定具有参数(也许没有)但却返回 TResult 参数指定的类型值的方法。
1:我们先看一个没有参数只有返回值的方法
2:有参数有返回值的方法
3:Func一个很重要的用处就是传递值,下面我举一个简单的代码来说明
注释1:DisplayVaue是处理传来的值,比喻缓存的处理,或者统一添加数据库等
总结
1:Action用于没有返回值的方法(参数可以根据自己情况进行传递)
2:Func恰恰相反用于有返回值的方法(同样参数根据自己情况情况)
3:记住无返回就用action,有返回就用Func
代码:
private void btnRun_Click(object sender, RoutedEventArgs e) { //Action 调用 Action act = new Action(InitData); //无参调用 act(); Action<int> act2 = new Action<int>(SetData); //有参调用 act2(0); //Func 调用,Func最后一个泛型类型参数为返回值类型 Func<int> func1 = new Func<int>(GetData); //无参有返回值 int data = func1(); Func<string, int> func2 = new Func<string, int>(Caculate); //一个参数有返回值 int len = func2("test"); Func<string, string, int> func3 = new Func<string, string, int>(SubLength); //两个参数一个返回值 int len2 = func3("test1", "test2"); } void InitData() { /***** * * ******/ } void SetData(int data) { /***** * * ******/ } int GetData() { /***** * * ******/ return 0; } int Caculate(string data) { return data.Length; } int SubLength(string data1, string data2) { return data1.Length + data2.Length; }
以下内容完全转载至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
相关文章推荐
- c#调用COM组件
- ActionScript 3.0 编程体验
- C#拼图游戏编写代码(2)
- 再谈Jquery Ajax方法传递到action(补充)
- C#实现把指定数据写入串口
- C#动态创建button的方法
- C#使用第三方组件生成二维码汇总
- C#中抽象方法与虚拟方法的区别
- c#中虚函数的相关使用方法
- C#实现给图片加水印的方法
- C#使用加边法计算行列式的值
- C#实现多线程的同步方法实例分析
- C#中尾递归的使用、优化及编译器优化
- C#中的delegate委托类型基本学习教程
- C# 动态加载程序集信息
- C#实现子窗体与父窗体通信方法实例总结
- C#通用邮件发送类分享
- 举例讲解C#中自动实现的属性
- C#中this的用法集锦
- C#数据结构之顺序表(SeqList)实例详解