zoukankan      html  css  js  c++  java
  • 委托和事件(多播委托)

    建一个控制台应用程序。

    定义一个委托

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

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

  • 相关阅读:
    linux—上传,下载本地文件到服务器
    elasticsearch摸石头过河——数据导入(五)
    elasticsearch摸石头过河——配置文件解析(四)
    elasticsearch摸石头过河——基本安装应用(三)
    elasticsearch摸石头过河——常用数据类型(二)
    spring AOP——名词,语法介绍(一)
    EXCEL(POI)导入导出工具类
    MAVEN 排除第三方jar
    elasticsearch摸石头过河——基本概念(一)
    websocket应用
  • 原文地址:https://www.cnblogs.com/sunliyuan/p/6036539.html
Copyright © 2011-2022 走看看