委托和事件(多播委托)

建一个控制台应用程序。

定义一个委托

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

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

 

posted @ 2016-11-06 21:48  石shi  阅读(847)  评论(0编辑  收藏  举报