委托和事件(多播委托)
建一个控制台应用程序。
定义一个委托
delegate int AddDel(int a,int b);
定义静态方法:
static int AddStaticFunc(int a, int b) { return a + b; }
调用:
AddDel del = new AddDel(AddStaticFunc); int result = del(3, 4); Console.WriteLine(result);
定义一个实例方法:
public int AddInstanceFunc(int a, int b) { return a + b+1; }
调用:
Program p = new Program(); del += p.AddInstanceFunc;
输出8 说明:
多播委托的时候:拿到委托返回值的、是最后一个委托的方法的执行结果
多播委托的内部如何实现呢?(分析)
委托的内部组要有三个部分组成:
1._methodPtr方法指针(指向当前委托指向的方法内存地址)
2._target目标对象(对象下面的方法)静态方法的时候为null
3.委托链(委托数组)---+=就代表就在次执行上面的方法-----就形成了委托数组
泛型委托
两个传入参数一个返回值(必须与类型对应)
Func<int, int, int> funcDemo = new Func<int, int, int>(AddStaticFunc);
静态的方法:
static int AddStaticFunc(int a, int b) { return a + b; }
调用:
int result = funcDemo(3, 4);
匿名方法的简化:
Func<int, int, int> funcDemo = delegate(int a, int b) { return a + b; };
Lambda语句:
Func<int, int, int> funcDemo = (int a, int b) => { return a + b; };
Lbmbda表达式:
Func<int, int, int> funcDemo = (int a, int b) => a + b;
前面有约束,自动推断:
Func<int, int, int> funcDemo = (a,b) => a + b;
还有一个泛型委托Action:(没有返回值)
为什么要定义两个泛型委托?一个有返回值,一个没有返回值(这样就不用认为的定义)
应用:
List<string> strList = new List<string>() { "3","9","32","7" };
要求:把集合中 字符串小于“6”的打印出来
var temp=strList.Where(delegate(string a) { return a.CompareTo("6") < 6; });
where 方法内部:遍历strList集合,把每个元素传到委托里面执行,如果委托返回true那么把元素选择出来,最后把所有满足条件的元素一块返回
foreach (var item in temp)
{ Console.WriteLine(item); }
用自定义的扩展方法:
扩展方法三要素:1.静态类 2.静态方法 3.this关键字
public static List<T> MyWhere<T>(this List<T> list,Func<T,bool> funcWhere) { List<T> result = new List<T>(); foreach (var item in list) { if( funcWhere(item)) { result.Add(item); } } return result; }
用自己的扩展方法:
var temp =strList.MyWhere(delegate(string a) { return a.CompareTo("6") < 0; });
Lambda方式:
方法类型的约束 可以省略。但是如果你是显示的约束,必须满足约束
最终在IL中会自动补全这个约束内容(语法糖)
var temp = strList.MyWhere(a => a.CompareTo("6") < 0);
委托的作用:把一个方法体作为参数传到另一个方法体中