委托和事件(多播委托)
原创
©著作权归作者所有:来自51CTO博客作者zhangyongshizhi的原创作品,请联系作者获取转载授权,否则将追究法律责任
建一个控制台应用程序。
定义一个委托
delegate int AddDel(int a,int
定义静态方法:
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);
委托的作用:把一个方法体作为参数传到另一个方法体中