C#委托Action、Action<T>、Func<T>、Predicate<T>
2016-03-25 11:07
525 查看
CLR环境中给我们内置了几个常用委托Action、Action<T>、Func<T>、Predicate<T>,一般我们要用到委托的时候,尽量不要自己再定义一个委托了,就用系统内置的这几个已经能够满足大部分的需求,且让代码符合规范。
一、Action
Action封装的方法没有参数也没有返回值,声明原型为:
用法如下:
如果委托的方法里的语句比较简短,也可以用Lambd表达式直接把方法定义在委托中,如下:
二、Action<T>
Action<T>是Action的泛型实现,也是没有返回值,但可以传入最多16个参数,两个参数的声明原型为:
用法如下:
同样也可以直接用Lambd表达式直接把方法定义在委托中,代码如下:
三、Func<T>
Func<T>委托始终都会有返回值,返回值的类型是参数中最后一个,可以传入一个参数,也可以最多传入16个参数,但可以传入最多16个参数,两个参数一个返回值的声明原型为:
用法如下:
同样也可以直接用Lambd表达式直接把方法定义在委托中,代码如下:
四、Predicate<T>
Predicate<T>委托表示定义一组条件并确定指定对象是否符合这些条件的方法,返回值始终为bool类型,声明原型为:
用法如下:
同样也可以直接用Lambd表达式直接把方法定义在委托中,代码如下:
总结:
如果要委托的方法没有参数也没有返回值就想到Action
有参数但没有返回值就想到Action<T>
无参数有返回值、有参数且有返回值就想到Func<T>
有bool类型的返回值,多用在比较器的方法,要委托这个方法就想到用Predicate<T>
如果感觉文章对您有帮助,请帮助推荐,谢谢。
一、Action
Action封装的方法没有参数也没有返回值,声明原型为:
1publicdelegatevoidAction();
用法如下:
1publicvoidAlert() 2{ 3Console.WriteLine("这是一个警告"); 4} 5 6Actiont=newAction(Alert);//实例化一个Action委托 7t();
如果委托的方法里的语句比较简短,也可以用Lambd表达式直接把方法定义在委托中,如下:
1Actiont=()=>{Console.WriteLine("这是一个警告");}; 2t();
二、Action<T>
Action<T>是Action的泛型实现,也是没有返回值,但可以传入最多16个参数,两个参数的声明原型为:
1publicdelegatevoidAction<inT1,inT2>(T1arg1,T2arg2);
用法如下:
1privatevoidShowResult(inta,intb) 2{ 3Console.WriteLine(a+b); 4} 5 6Action<int,int>t=newAction<int,int>(ShowResult);//两个参数但没返回值的委托7t(2,3);
同样也可以直接用Lambd表达式直接把方法定义在委托中,代码如下:
1Action<int,int>t=(a,b)=>{Console.WriteLine(a+b);}; 2t(2,3);
三、Func<T>
Func<T>委托始终都会有返回值,返回值的类型是参数中最后一个,可以传入一个参数,也可以最多传入16个参数,但可以传入最多16个参数,两个参数一个返回值的声明原型为:
1publicdelegateTResultFunc<inT1,inT2,outTResult>(T1arg1,T2arg2);
用法如下:
1publicintCompare(inta,intb) 2{ 3returna>b; 4} 5 6Func<int,int,bool>t=newFunc<int,int,bool>(Compare);//传入两个int参数,返回bool值7boolresult=t(2,3);
同样也可以直接用Lambd表达式直接把方法定义在委托中,代码如下:
1Func<int,int,bool>t=(a,b)=>{returna>b;}; 2boolresult=t(2,3);
四、Predicate<T>
Predicate<T>委托表示定义一组条件并确定指定对象是否符合这些条件的方法,返回值始终为bool类型,声明原型为:
1publicdelegateboolPredicate<inT>(Tobj);
用法如下:
1publicboolMatch(intval) 2{ 3returnval>60; 4} 5 6Predicate<int>t=newPredicate<int>(Match);//定义一个比较委托7int[]arr={13,45,26,98,3,56,72,24}; 8intfirst=Array.Find(arr,t);//找到数组中大于60的第一个元素
同样也可以直接用Lambd表达式直接把方法定义在委托中,代码如下:
1Predicate<int>t=val=>{returnval>60;};//定义一个比较委托2int[]arr={13,45,26,98,3,56,72,24};
3intfirst=Array.Find(arr,t);//找到数组中大于60的第一个元素
总结:
如果要委托的方法没有参数也没有返回值就想到Action
有参数但没有返回值就想到Action<T>
无参数有返回值、有参数且有返回值就想到Func<T>
有bool类型的返回值,多用在比较器的方法,要委托这个方法就想到用Predicate<T>
如果感觉文章对您有帮助,请帮助推荐,谢谢。
相关文章推荐
- c# 如何通过反射 获取\设置属性值
- C#中的ODBC、OLEDB连接
- C#控制鼠标移动
- C#解leetcode 64. Minimum Path Sum
- C# 实体转换为DataTable
- C#入门到精通 笔记二
- C#获取本地IP地址兼容win7和xp
- C# 类构造函数赋值里属性与字段赋值注意项
- C# 对多个文件进行zip压缩
- C#中的静态成员、静态方法、静态类介绍
- 在C#中如何使用正式表达式获取匹配所需数据
- 从0自学C#10--在线绘制类图
- C#Winform子报表功能
- C#的互操作性:缓冲区、结构、指针
- 【C#进阶系列】16 数组
- 【C#进阶系列】15 数组
- C#打印GroupBox控件区域
- c# socket 异步
- C#关于取DataTable中中间数据的方法
- C#——判断成绩是否通过