zoukankan      html  css  js  c++  java
  • 委托,匿名方法,Lambda,泛型委托,表达式树

    一、委托:
    完成一个委托应分三个步骤:
    //step01:首先用delegate定义一个委托;
    public delegate int CalculatorAdd(int x, int y);
    //step02:声明一个方法来对应委托.
    public int Add(int x, int y)
    {
     return x + y;
    }
    protected void FrmTest_Load(object sender, EventArgs e)
    {
     //step03:用这个方法来实例化这个委托.
     CalculatorAdd cAdd = new CalculatorAdd(Add);
     //int result = cAdd(5, 6);
     int result = cAdd.Invoke(5,6);
    }
    step01:首先用delegate定义一个委托.
    step02:声明一个方法来对应委托.
    step03:用这个方法来实例化这个委托.
    至此,一个委托的应该就完成了,就可以调用委托了.
    事件是委托的一个实例,此处暂且不说.

    二、匿名方法:
    匿名方法是用来简化上边的三个步骤的语法糖.
    //step01:首先用delegate定义一个委托;
    public delegate int CalculatorAdd(int x, int y);
    protected void FrmTest_Load(object sender, EventArgs e)
    {
     //step02:把一个方法赋值给委托
     CalculatorAdd cAdd = delegate(int x, int y) { return x + y; };
     //int result = cAdd(5, 6);
     int result = cAdd.Invoke(5,6);
    }
    step01:首先用delegate定义一个委托.
    step02:把一个方法赋值给委托,其实这种写法就是匿名方法.

    三、Lambda表达式:
    微软对C#的设计理念是简单易用,对匿名方法再次进行简化,Lambda就出现了,几种lambda表达式的写法.
    public delegate int CalculatorAdd(int x, int y);
    protected void FrmTest_Load(object sender, EventArgs e)
    {
     //方法一:
     CalculatorAdd cAdd1 = (int x, int y) => { return x + y; };
     int result1 = cAdd1(5, 6);

     //方法二:
     CalculatorAdd cAdd2 = (x, y) => { return x + y; };
     int result2 = cAdd2(5, 6);

     //方法三:
     CalculatorAdd cAdd3 = (x, y) => x + y;
     int result3 = cAdd2(5, 6);
    }
    方法一:简单的把delegate去掉,在()与{}之间加上"=>";
    方法二:在方法一的基础上把参数类型干掉;
    方法三:在方法二的基础上把{},以及return关键字都去掉了;

    四、泛型委托:
    不管是匿名方法还是Lambda表达式,完成一个委托的应用,都逃不过两个步骤,一步定义委托,另一步是用一个方法来实例化一个委托。
    泛型委托把这两步合成一步。用Func来简化一个委托的定义,其中的Func就是所谓的泛型委托。如果委托函数是返回void,就将Func<>换成Action<>.
    protected void FrmTest_Load(object sender, EventArgs e)
    {
     //方法一:
     Func<int,int,int> cAdd1 = (int x, int y) => { return x + y; };
     int result1 = cAdd1(5, 6);

     //方法二:
     Func<int, int, int> cAdd2 = (x, y) => { return x + y; };
     int result2 = cAdd2(5, 6);

     //方法三:
     Func<int, int, int> cAdd3 = (x, y) => x + y;
     int result3 = cAdd3(5, 6);
    }

    五、表达式树:
    表达式树是存放委托的容器,或者说是存取Lambda表达式的一种数据结构。要用Lambda表达式的时候,直接从表达式中获取出来,Compile()就可以直接用了。
    protected void FrmTest_Load(object sender, EventArgs e)
    {
     Expression<Func<int, int, int>> exp = (x, y) => x + y;
     Func<int, int, int> fun = exp.Compile();
     int result = fun(2, 3);
    }

  • 相关阅读:
    SDWebImage内存性能优化
    dataGridView1数据导出
    listView数据导出
    sqlserver定时备份
    C#-IniFiles文件配置连接数据库
    (转)线程同步详解
    C#工具类:Json操作帮助类(转载)
    c#实现验证码功能
    屏蔽F12审查元素,禁止使用右键菜单
    c# excel如何导入到sqlserver数据库
  • 原文地址:https://www.cnblogs.com/junior/p/4313792.html
Copyright © 2011-2022 走看看