您的位置:首页 > 编程语言 > C#

C#中委托和Lambda表达式

2016-03-22 20:15 555 查看
什么是委托?

简单来说委托是一个类型,这个类型可以赋值一个方法的引用。

委托

声明委托

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);


代码相比匿名方法更加简洁。

事件

事件是一种特殊的委托,或者说是受限制的委托,是委托一种特殊应用,只能施加+= 和-=操作符。

事件不允许在类的外部被直接触发,只能在类的内部适合的时机触发。委托可以在外部被触发。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: