建一个控制台应用程序。

定义一个委托

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

委托的作用:把一个方法体作为参数传到另一个方法体中