委托、Action泛型委托、Func泛型委托、Predicate泛型委托的用法
一、举一委托场景:天气很热,二狗子想去买瓶冰镇可乐,但是二狗子很懒,于是他想找个人代他去,于是要有个代理人。
创建代理人之前先定义委托:public delegate string BuyColaDelegate(string drink);
创建代理人:BuyColaDelegate delegate = new BuyColaDelegate();(错误代码)
那么问题来了,这个代理人需要绑定一个方法啊,不然他知道自己去干啥,所以需要创建一个真正的代理人:
BuyColaDelegate delegate = new BuyColaDelegate(BuyCola);
public static string BuyCola(string drink)
{
try
{
WriteLine($"购买:{drink}");
return "购买完成";
}
catch (Exception ex)
{
WriteLog(LogType.ERROR, "Program", "BuyCola", ex.ToString());
return null;
}
}
以上才是创建了一个真正的代理人,然后代理人一旁待命。二狗子这时给代理人发出了去买可乐的命令:
string res = delegate("可乐");
当res == "购买完成",二狗子就舒服的喝上了冰镇可乐,NM,简直爽歪歪。
注:
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。事件是一种特殊的委托。
delegate我们常用到的一种声明,委托至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型。
二、二狗子有点郁闷,我就买瓶可乐而已,还要我自己搞一个代理人,烦死了。有没有现成的代理人啊,给我用用,Action出场:
Action ac1 = new Action();(错误代码)
这个代理人能力有点弱鸡,一个参数都带不了,而且还不能有返回值。
public static void BuyCola()
{
try
{
WriteLine("购买:可乐");
}
catch (Exception ex)
{
WriteLog(LogType.ERROR, "Program", "BuyCola", ex.ToString());
}
}
Action ac1 = new Action(BuyCola);
二狗子这时又爽歪歪的给这个代理人发出了去买可乐的命令:ac1 ();
注:
Action是无返回值的泛型委托。
Action 表示无参,无返回值的委托
Action<int,string> 表示有传入参数int,string无返回值的委托
Action<int,string,bool> 表示有传入参数int,string,bool无返回值的委托
Action<int,int,int,int> 表示有传入4个int型参数,无返回值的委托
Action至少0个参数,至多16个参数,无返回值。
三、二狗子这个懒小孩又郁闷了(怎么老是郁闷),可乐喝完了,我还想买冰镇西瓜怎么办,难道我再搞个BuyWatermelon(),
再把里面参数写死?不!另一个Action上场:
Action<string> ac2 = new Action<string>();(错误代码)
public static void BuyDrink(string drink)
{
try
{
WriteLine($"购买:{drink}");
}
catch (Exception ex)
{
WriteLog(LogType.ERROR, "Program", "BuyDrink", ex.ToString());
}
}
Action<string> ac2 = new Action<string>(BuyDrink);
二狗子这时再次爽歪歪的给这个代理人发出了去买西瓜的命令:ac2 ("西瓜"); 二狗子如愿以偿的吃上了西瓜(吃个瓜真不容易)。
ac2 ("雪碧");ac2 ("山珍海味");ac2 ("满汉全席");........
四、二狗子是个善于思考的人,他在想代理人去买东西,我得知道结果啊,我让他买西瓜,回来跟我说没买到,谁知道是不是半路被他干掉了呢?
Func<string,string> func1 = new Func<string, string>(BuyDrink);
public static string BuyDrink(string drink)
{
try
{
WriteLine($"购买:{drink}");
return "购买完成";
}
catch (Exception ex)
{
WriteLog(LogType.ERROR, "Program", "BuyDrink", ex.ToString());
return null;
}
}
这样二狗子就知道了结果,代理人心里只能大喊MMP。
注:
Func是有返回值的泛型委托
Func<int> 表示无参,返回值为int的委托
Func<object,string,long> 表示传入参数为object, string 返回值为long的委托
Func<object,string,int> 表示传入参数为object, string 返回值为int的委托
Func<T1,T2,T3,int> 表示传入参数为T1,T2,T3(泛型)返回值为int的委托
Func至少0个参数,至多16个参数,根据返回值泛型返回。必须有返回值,不可void,参数最后一个type表示返回值类型。
五、
predicate 是返回bool型的泛型委托
predicate<int> 表示传入参数为int 返回bool的委托
Predicate有且只有一个参数,返回值固定为bool
例:public delegate bool Predicate<T> (T obj)
Predicate<string> pre1 = new Predicate<string>(XXX);
委托、Action泛型委托、Func泛型委托、Predicate泛型委托的用法的更多相关文章
- C#委托Action、Action<T>、Func<T>、Predicate<T>
CLR环境中给我们内置了几个常用委托Action. Action<T>.Func<T>.Predicate<T>,一般我们要用到委托的时候,尽量不要自己再定义一 个 ...
- [转]C#委托Action、Action<T>、Func<T>、Predicate<T>
CLR环境中给我们内置了几个常用委托Action. Action<T>.Func<T>.Predicate<T>,一般我们要用到委托的时候,尽量不要自己再定义一 个 ...
- C#委托Action、Action<T>、Func<T>、Predicate<T>系统自带的委托
C#委托Action.Action<T>.Func<T>.Predicate<T> CLR环境中给我们内置了几个常用委托Action. Action<T& ...
- Action<T>和Func<T>
Action<T>和Func<T>都是泛型委托. Action<T>表示委托可以引用一个viod返回类型的方法,至于方法是带几个参数,什么类型的参数,由后面的泛型决 ...
- 委托delegate 泛型委托action<> 返回值泛型委托Func<> 匿名方法 lambda表达式 的理解
1.使用简单委托 namespace 简单委托 { class Program { //委托方法签名 delegate void MyBookDel(int a); //定义委托 static MyB ...
- 泛型委托Action与ActionT
以前都是自己写委托,其实系统内部给我们系统了委托的. Action ——委托的非泛型版本就是一个无参数无返回值的委托. Action<T>——委托的泛型版本是一个无返回值,但是参数个数及类 ...
- C#学习笔记:泛型委托Action<T>和Fun<TResult>
转自:http://www.cnblogs.com/Joetao/articles/2094271.html 本节学习了泛型委托Action<T>和Fun<TResult>两类 ...
- C#语法糖之第五篇: 泛型委托- Action<T>
因为工作的原因(其实还是个人的惰性)昨天没有给大家分享文章,然后这几天也有很多园友也提出了他们报告的意见及指导,再次感谢这些兄弟们的照顾我 和支持,这个分类的文章我当时想的是把我的学习经验和工作中用到 ...
- C#常见委托のdelegate定义,Func,Action,Predicate总结
委托,顾名思义,就是让其他代理,本质就是为具有共性方法组定义一个方法模板:(交流可以加qq群:435226676) 委托常见的方式有一般委托显示定义,Func<T,TResult> (T, ...
- Action<T>和Func<T>委托
Action<T>和Func<T>委托 泛型Action<T>委托和Func<T>委托是系统定义的两个泛型委托. Action<T>委托表示 ...
随机推荐
- Angular常用命令:
新建项目: ng new angualrdermo08 --skip-install 创建需要的组件: ng g component home
- linux6 x86-64 RPM包安装mysql5.7.20
注意版本和此次更新时间 2017-12-03 版本:mysql-5.7.20-1.el6.x86_64 环境:linux6.x 官方下载地址: wget https://dev.mysql.co ...
- Pythonrandom模块(获取随机数)常用方法和使用例子
Python random模块(获取随机数)常用方法和使用例子 这篇文章主要介绍了Python random模块(获取随机数)常用方法和使用例子,需要的朋友可以参考下 random.random ra ...
- Swift4.0复习闭包
1.闭包的定义和调用: _ = { (param1: Int, param2: Float, param3: Void) -> return_type in // 闭包执行代码 /* ... * ...
- UITableView实现行纵向颜色渐变
实现效果如下: 其实实现很简单,开始觉得使用颜色值和tableView的indexPath.row挂钩使用即可 或者使用CAGradientLayer实现渐变 最后使用alpha实现即可.需要注意的是 ...
- 【Leetcode_easy】941. Valid Mountain Array
problem 941. Valid Mountain Array solution: class Solution { public: bool validMountainArray(vector& ...
- Data - 【转】数据分析的道与术
简要说明 本文来自网络流传的"百度内部培训PPT - 数据分析的道与术",版权属于"百度",如有冒犯,即刻删除. PDF下载 - 数据分析的道与术 什么是数据分 ...
- iOS 多线程的简单理解(4) 线程锁的简单使用
要用到多线程 ,就不得不考虑,线程之间的交互,线程是否安全 推荐一个原文链接 是关于 线程锁的基本使用的 http://blog.csdn.net/qq_30513483/article/detai ...
- python解包
概念 python的解包可以这样来理解:把元素给拆分并把其赋值给自己所需要的变量,因此元素应该是一个可迭代对象. 形式 简单版本 下面展示的是解包的基本形式,根据长度赋值给对应多的变量. name_l ...
- WIN10桌面无创建文件夹选项,无法创建文件
在桌面或其他磁盘,右键没有新建选项,无法新建文件夹或文档. 右键桌面左下角开始按钮,点击:命令提示符(管理员) 弹出,Windows命令处理程序对话框,点击是 粘贴内容: cmd /k r ...