C#中委托和Lambda表达式
2016-03-22 20:15
555 查看
什么是委托?
简单来说委托是一个类型,这个类型可以赋值一个方法的引用。
委托
声明委托
delegate return_type delegate_name(parameter_type parameter_name, ...);
2.delegate_name delegate_instance = method_name;
第二种方法更简洁。
2.delegate_instance.Invoke();
介绍
Acton委托引用了一个void返回类型的方法,T表示方法参数, 可以传递0~16个参数。
Action//没有参数
Action<in T>//一个参数
Action<in T1,in T2>//两个参数
Action<in T1,in T2 ... ,in T16>//16个参数
介绍
Func引用了一个带有返回值的方法,可以传递0~16个参数类型,和一个返回类型
Func<out TResult>//只有返回类型
Func<in T, out TResult>//有一个参数和返回类型
Func<in T1, in T2, ... , in T16,out TResult>//有16个参数和一个返回类型
多播委托包含一个逐个调用的委托集合,如果通过委托调用的其中一个方法抛出异常,整个迭代就会停止。
多播委托使用 += 给原有委托加上方法,使用-=减去其中包含的方法。
例如:
Action action = Test1;
action += Test2;
action -= Test1;
这里相当于把引用的方法直接写在了后面。
匿名方法主要的有点是减少了代码量和代码复杂度。
之前匿名方法的例子可以修改为:
代码相比匿名方法更加简洁。
事件不允许在类的外部被直接触发,只能在类的内部适合的时机触发。委托可以在外部被触发。
简单来说委托是一个类型,这个类型可以赋值一个方法的引用。
委托
声明委托
delegate return_type delegate_name(parameter_type parameter_name, ...);委托的赋值
1. delegate_name delegate_instance = new delegate_name(method_name);2.delegate_name delegate_instance = method_name;
第二种方法更简洁。
使用委托
1.delegate_instance();2.delegate_instance.Invoke();
Action委托
介绍
Acton委托引用了一个void返回类型的方法,T表示方法参数, 可以传递0~16个参数。Action//没有参数
Action<in T>//一个参数
Action<in T1,in T2>//两个参数
Action<in T1,in T2 ... ,in T16>//16个参数
Func委托
介绍
Func引用了一个带有返回值的方法,可以传递0~16个参数类型,和一个返回类型Func<out TResult>//只有返回类型
Func<in T, out TResult>//有一个参数和返回类型
Func<in T1, in T2, ... , in T16,out TResult>//有16个参数和一个返回类型
多播委托
介绍
之前使用的委托都只包含一个方法的调用,但是委托也可以包含多个方法,这种委托叫做多播委托。使用多播委托就可以按照顺序调用多个方法,多播委托只能得到调用的最后一个方法的结果,一般把多播委托的返回类型声明为void。多播委托包含一个逐个调用的委托集合,如果通过委托调用的其中一个方法抛出异常,整个迭代就会停止。
多播委托使用 += 给原有委托加上方法,使用-=减去其中包含的方法。
例如:
Action action = Test1;
action += Test2;
action -= Test1;
取得多播委托中所有方法的委托
Action a1 = Method1; a1+=Method2; delegate[] delegates=a1.GetInvocationList(); foreach(delegate d in delegates){ d.DynamicInvoke(null); }
匿名方法
之前使用委托,都是先定义一个方法,然后把方法给委托的实例。但还有一种使用委托的方式,不用去定义一个方法,使用匿名方法。Func<int,int,int> plus = delegate (int a,int b){ return a+b; }; int res = plus(233,233); Console.WriteLine(res);
这里相当于把引用的方法直接写在了后面。
匿名方法主要的有点是减少了代码量和代码复杂度。
Lambda表达式
从c#3.0开始,可以使用Lambda表达式代替匿名方法。只要有委托参数类型的地方就可以使用Lambda表达式。之前匿名方法的例子可以修改为:
Func<int,int,int> plus = (a,b)=>{ return a+b; }; int res = plus(233,233); Console.WriteLine(res);
代码相比匿名方法更加简洁。
事件
事件是一种特殊的委托,或者说是受限制的委托,是委托一种特殊应用,只能施加+= 和-=操作符。事件不允许在类的外部被直接触发,只能在类的内部适合的时机触发。委托可以在外部被触发。
相关文章推荐
- 文件
- C#如何调用其他.config配置文件,就是2个乃至3个以上的config文件
- C#机房重构——导出excel表
- ffmpeg从rtsp抓流存flv[c# NReco.VideoConverter flv]
- c# 学习之一:编码约定
- 登山-C#-为枚举创建新方法
- c# - StringTest
- 如何使用C#创建WebService
- C# Winform中窗体的美化——用IrisSkin4.dll美化你的WinForm
- c#输入一个字符串,并把字符串的第一个字符变为大写,如果字符串中有空格则把空格的下个字符变为大写之后输出
- C# WinForm实现Win7 Aero磨砂效果
- C#中Math.Round四舍五入的用法详解,
- 登山-C#-enum类型基础
- C#枚举中的位运算权限分配浅谈
- C#类、接口、虚方法和抽象方法0322
- C#设置子窗体在主窗体中居中显示解决方案
- 发送传真的c#方法_.NET教程
- C#调用java代码
- C#POST下载文件服务器返回500错误
- C#函数式编程之缓存技术