免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
委托、Lambda表达式1. 委托2(1) 委托的本质2(2) 使用委托的示例2(3) 委托的Invoke与BeginInvoke方法21、 Invoke方法22、 BeginInvoke方法23、 委托的EndInvoke方法3(4) Action、Func与Predicate(泛型委托)31、 Action无返回值的泛型委托32、 Func带有返回值的泛型委托43、 Predicate委托(常用于集合参数)4(5) 多播委托4(6) 使用委托定义匿名方法52. Lambda表达式5(1) Lambda表达式本质5(2) Lambda表达式使用示例5(3) Lambda表达式语法61、 表达式Lambda语法(参数语法)62、 语句Lambda语法(函数体语法)63、 类型猜测64、 Lambda式中的变量作用域6作者:李志伟时间:2014-01-181. 委托(1) 委托的本质委托实际上就是指向函数的指针。在C#中委托是一种类型,定义一个委托就是定义一个新的类,它与类的地位是一样的,所以可以定义类的地方都可以定义委托!实际上,使用delegate关键字定义的委托继承了System.MulticastDelegate类,而System.MulticastDelegate类又继承了System.Delegate。Delegate:表示委托,委托是一种数据结构,它引用静态方法或引用类实例及该类的实例方法。MulticastDelegate:表示多路广播委托;即,其调用列表中可以拥有多个元素的委托。(2) 使用委托的示例 delegate string DelegateMethod(int a, int b);/定义委托 class Program static void Main(string args) DelegateMethod dm = new DelegateMethod(Method);/或:DelegateMethod dm = Method Console.WriteLine(dm(10, 20);/执行委托 Console.Read(); private static string Method(int a, int b) return 相加结果: + (a + b); (3) 委托的Invoke与BeginInvoke方法1、 Invoke方法实际上,给委托实例提供圆括号与调用委托的Invoke方法效果完全相同: delegate string DelegateMethod(int a, int b);/定义委托 class Program static void Main(string args) DelegateMethod dm = Method; Console.WriteLine(dm.Invoke(10, 20);/执行委托 Console.Read(); private static string Method(int a, int b) return 相加结果: + (a + b); 2、 BeginInvoke方法调用委托实例的BeginInvoke方法就是开启一个新的线程执行委托实例指向的方法。 delegate void DelegateMethod(int a, int b);/定义委托 class Program static void Main(string args) DelegateMethod dm = Method; for (int i = 0; i 10; i+) dm.BeginInvoke(i, 20, null, null);/异步调用委托 Console.Read(); private static void Method(int a, int b) Console.WriteLine(相加结果: + (a + b);/执行委托 BeginInvoke方法有三种参数,第一种参数是委托实例指向的方法的参数(可能有多个);第二种参数的类型是AsyncCallback,AsyncCallback是一个委托类型,其定义是delegate void AsyncCallback(IAsyncResult ar),当调用BeginInvoke方法的委托实例异步执行完成时,就会执行该参数指向的方法;第三种参数是object类型,主要是向第二种参数传递一些值,一般可以传递被调用方法的委托,这个值可以使用IAsyncResult.AsyncState属性获得。(具体请参考“C#多线程”) delegate void DelegateMethod(int a, int b);/定义委托 class Program static void Main(string args) DelegateMethod dm = Method; dm.BeginInvoke(10, 20, MethodCompleted, null);/异步调用委托 Console.Read(); /异步委托 private static void Method(int a, int b) Console.WriteLine(相加结果: + (a + b); Thread.Sleep(3000); /回调函数 private static void MethodCompleted(IAsyncResult ar) Console.WriteLine(休眠结束!); 3、 委托的EndInvoke方法如果调用了委托实例的BeginInvoke方法,就可以通过EndInvoke方法获得委托实例指向的方法的返回值,或是确定指向的方法已经被成功调用。(具体请参考“C#多线程”) delegate string DelegateMethod(int a, int b);/定义委托 class Program static void Main(string args) DelegateMethod dm = Method; IAsyncResult ar = dm.BeginInvoke(10, 20, null, null);/异步调用委托 string result = dm.EndInvoke(ar);/等待委托异步调用结束 Console.WriteLine(result);/输出返回值 Console.Read(); /异步委托 private static string Method(int a, int b) Thread.Sleep(3000); return 相加结果: + (a + b); (4) Action、Func与Predicate(泛型委托)除了为每个参数和返回类型定义一个新委托之外,还可以使用Action与Func泛型委托。使用泛型委托主要的优势是可以省略委托的定义。1、 Action无返回值的泛型委托泛型Action委托表示引用一个void返回类型的方法,这个委托类可以有多个(0)参数且参数的类型可以不同(最多可以有16种不同类型的参数)。 class Program static void Main(string args) Action dm = Method;/委托实例 dm(10,20);/调用委托 Console.Read(); private static void Method(int a, int b) Console.WriteLine(相加结果: + (a + b); 2、 Func带有返回值的泛型委托泛型Func委托与Action委托类似,不同点是Func允许调用带返回值类型的方法,而且其返回值类型的指定是Func中的最后一个类型(Tn),即Tn就是其返回值,其它类型都表示参数的类型。(最多可以有16种参数类型和一个返回值类型) class Program static void Main(string args) Func dm = Method;/委托实例 string result = dm(10, 20);/调用委托 Console.WriteLine(result);/输出返回值 Console.Read(); private static string Method(int a, int b) return 相加结果: + (a + b); 3、 Predicate委托(常用于集合参数)Predicate泛型委托,只能接受一个传入参数,返回值为bool类型。 class Program static void Main(string args) Predicate dm = Method;/委托实例 if (dm(12)/调用委托 Console.WriteLine(偶数); else Console.WriteLine(奇数); Console.Read(); private static bool Method(int a) if(a%2=0) return true; return false; (5) 多播委托前面的委托只包含一个方法,但是委托也可以包含多个方法,这种委托称为多播委托。如果调用多播委托就可以按顺序连续调用多个方法,为此委托的定义就必须返回void,否则就只能得到委托调用的最后一个方法的结果。多播委托可以识别“+、-、+=、-=”运算符。 class Program static void Main(string args) Action dm = null; /委托实例 for (int i = 0; i 20; i+) if (i % 2 = 0) dm += Method1; else dm += Method2; dm(123456);/调用多播委托 Console.Read(); private static void Method1(int a) Console.WriteLine(委托1: + a); private static void Method2(int a) Console.WriteLine(委托2: + a); (6) 使用委托定义匿名方法 class Program static void Main(string args) Action dm = delegate(int a) Console.WriteLine(a.ToString(); ;/匿名方法 dm(123456);/调用委托指向的匿名方法 Console.Read(); 2. Lambda表达式(1) Lambda表达式本质Lambda表达式的本质是一个匿名函数,Lambda表达式只能与委托配合使用,其优势在可以很方便的定义匿名方法。所有Lambda表达式都使用Lambda运算符=,该运算符读作goes to。Lambda运算符的左边是输入参数(如果有),右边是表达式或语句块。(2) Lambda表达式使用示例 class Program static void Main(string args) /标准的Lambda格式 Func sum0 = (int a, int b) = return 和是: + (a + b); ; Console.WriteLine(sum0(10, 20); /简写格式 Func sum1 = (a, b) = 和是: + (a + b); Console.WriteLine(sum1(30, 40); Action sum2 = (a, b) = Console.WriteLine(和是: + (a + b); sum2(50, 60); Console.Read(); (3) Lambda表达式语法1、 表达式Lambda语法(参数语法)如果只有一个输入参数时,括号可以省略,如:(x) = x * x 等于 x = x * x如果具有一个以上的输入参数,必需加上括号,如:(x, y) = x = y可以显式指定输入参数的类型,如:(int x, string s) = s.Length x也可以没有任何输入参数,如:() = Console.WriteLine(无参数的Lambda表达式)2、 语句Lambda语法(函数体语法)语句写在大括号中,如:Action sum = (a, b) = int i = a = +b; Console.Write(i); ;只有一条语句时,可以省略大括号“”,如:Action sum = (a, b) = Console.Write(a + b);当匿名方法有返回值时,可以使用return,如:Func sum0 = (a, b) = return 和是: + (a + b); ;当匿名方法有返回值,且只有一条语句时,可以省略大括号“”和return,如:Func sum1 = (a, b) = 和是: + (a + b);注意:当有返回值时,语句Lambda中使用了大括号就一定要使用return关键字返回;反之使用了return关键字返回结果就一定要使用大括号。即:return关键字与大括号必须同时省略!3、 类型猜测当编写一个Lambda式的时候,我们通常不需要明确指定输入参数的类型。因为编译器会根据Lambda体的实现,以及委托的定义来猜测类型。如:如果要从一个List中删除小于100的元素List list = new List(); list.RemoveAll(i = i 100);/i会被猜测为int通常的猜测规则如下:Lambda式必须包含与委托定义中相等数量的输入参数;每个Lambda式的输入参数必须能够隐式转换成委托定义中所要求的输入参数;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 门窗施工协议书模板
- 防静电地板安装施工免责协议书
- 2026-2031中国轨道交通信息系统行业市场分析及投资可行性研究报告
- 2026-2031中国光伏发电行业发展现状分析研究报告
- 2026-2031中国功能性护肤品行业发展现状、市场现状及行业发展趋势
- 2025年煤矿工人岗前安全培训考试题及答案
- 2025年应急预案教育培训试题及答案
- 物流公司运输安全应急预案
- 语文壶口瀑布获奖教案
- 酒店停电停水应急预案
- 2025年度国家工作人员学法用法考试题库(含答案)
- 青少年无人机基础飞行课件
- 广州医院消防培训课件
- 红十字会考试试题及答案2025
- 林木砍伐合伙合同协议书
- 活络模具基础知识培训
- 2024版2025秋新版小学道德与法治三年级上册全册教案教学设计含反思
- 大学生职业生涯规划课件 第九章 全国大学生职业规划大赛(成长赛道)参赛指导
- 【里斯】现制饮品出海品类研究报告
- 校园垃圾清运实施方案
- 国培计划返校汇报经验分享
评论
0/150
提交评论