我们知道委托非常强大,首先我们要使用委托解决的就是对象之间信息的“逆向传递问题”。
其次,其实委托还有很多的用途。(匿名方法、Lambda表达式,和泛型结合)最后,我们在学到一定程度的时候,
我们必须研究底层原理。(比如我们学EntityFramework,linq各种查询,扩展方法)
一、匿名方法、Lambda表达式
1、匿名方法的概念:一个方法没有具体的名称,而只有关键字delegate、方法参数、方法体,这种方法是匿名方法。
匿名方法的好处:将具体方法和委托直接关联到一起,如果我们基于委托只需要一个方法的时候,匿名方法肯定是显得简单。
2. Lambda表达式:在C#3.0出现的。使用这种表达的可以更简练的编写代码块。
CalculatorDelegate cal3 = (int a, int b) => { return a + b; };
CalculatorDelegate cal4 = (a, b) => a - b;
【1】在Lambda表达式中参数类型可以是明确类型,也可以是推断类型。
【2】如果是推断类型,则参数类型可以由编译根据上下文自动推断出来。
【3】运算符=> 读作goes to ,运算符左边输入参数(如果有),右边是表达式或语句块。
【4】表达式两种方式:
(input args)=>表达式
(input args)=>{ 语句1;语句2;语句3....}
【5】Lambda表达式和匿名方法的比较
第一、Lambda表达式本身就是匿名方法。
第二、Lambda表达式允许不指明参数类型,但是匿名方法必须要明确。
第三、Lambda表达式允许单一的表达式或多条语句组成,而匿名方法不允许单一表达式。
二、自定义泛型委托
1.为什要使用泛型委托?普通委托在数据类型的限定上非常严格的。有时候我们需求变化,可能适应不了。
2.泛型委托定义:本质上和泛型方法是非常相似的,泛型委托关联的时候,可以是具体方法、匿名方法、lambda表达式
3.问题引出:仔细研究我们写的泛型委托: public delegate T MyGenericDelegate<T>(T param1, T param2);
试想:如果我们使用4个参数?5个参数?8个参数?按照目前思路,不得不定义很多这种泛型委托!很麻烦!
三、系统泛型委托
针对问题的解决:.NET平台早就为你考虑了这种简单的泛型委托,那就是人家已经定义好了,我们可以直接使用!
两种方式:一种是有返回值Func<args>,一种返回bool的Predicate<args>,一种是没有返回值的Action<args>。
Action<>在多线程中用的非常多。
Func<>,Predicate<>在扩展方法中用的非常多。
请直接参考实例代码。
结论:泛型委托作为方法参数,实际上传递的是一个具体方法或一个Lambda表达式! (多态一种表现)