之前总结了委托这个困惑着大多初学者的概念,继续来学习匿名方法和lambda表达式

(1)我们之前写了这样一段代码

//自定义一个委托
public delegate int Expression(int a, int b);
class Program
{
static void Main(string[] args)
{
//(2)委托扩展
//Expression ex = Add;
//Calculate(ex, 25, 10);
Calculate(Add, , );
}
static int Add(int a, int b)
{
return a + b;
}
static int Divide(int a, int b)
{
return a / b;
}
static int subtract(int a, int b)
{
return a - b;
}
static int multiply(int a, int b)
{
return a * b;
}
static int GetAdd(int a, int b)
{
return a + b;
}
static void Calculate(Expression ex, int a, int b)
{
Console.WriteLine(ex(a, b) + "\n");
}
}

  我们既然之前说到已经把Calculate封装起来了,那么这里我们就把Calculate方法看成一个已经封装好了的方法(这里只是为了举例,并不是指Calculate方法真的已经完全封装好了),那么既然Calculate已经不能改了,那么四个加减乘除方法有什么可以优化的地方呢?,我们把a - b,a * b,a / b等等可以写的计算表达式写成不同的方法,而且还分别不同命名,这样做是不是有点过于“浪费”了勒,我们写这样四个方法真正要实现的目的就是能让四个方法传递到另一个方法的某一个语句块中被执行,这段要被传递的语句块有没有名字其实并不重要,那么这里就要引出一位今天的主人公了,他就是匿名方法,很多人刚接触这个概念时可能会一头雾水,而且大多教科书都喜欢把它放在委托的后面讲,就会觉得这个东西很神奇,其实匿名方法并没有那么复杂,不明白只是因为对这个概念生疏而已,或者说是人的惯性思维,我们在初学时都习惯了约定俗成的认为一个方法必须有名字,有参数,有返回值,其实语言的设计者再设计方法(有的语言也叫函数)的初衷就是增加代码的重用,使代码更灵活而已,不管是方法还是匿名方法,其本质都是一段执行语句,所以顾名思义,匿名方法就是没有名字的一方法,那方法是什么,你可以粗暴的理解为方法就是一段可以通过方法名来调用执行语句,那么匿名方法就是一段没有名字的执行语句,他们都是执行语句。说了这么多我来具体看一下,如何通过匿名方法实现上面的代码

//自定义一个委托
public delegate int Expression(int a, int b);
class Program
{
static void Main(string[] args)
{
//(3)匿名方法
Expression add = delegate (int a, int b) { return a + b; };
Expression subtract = delegate (int a, int b) { return a - b; };
Expression multiply = delegate (int a, int b) { return a * b; };
Expression divide = delegate (int a, int b) { return a / b; };
Calculate(add, , );
} //static int Add(int a, int b)
//{
// return a + b;
//}
//static int Divide(int a, int b)
//{
// return a / b;
//}
//static int subtract(int a, int b)
//{
// return a - b;
//}
//static int multiply(int a, int b)
//{
// return a * b;
//} static void Calculate(Expression ex, int a, int b)
{
Console.WriteLine(ex(a, b) + "\n");
}
}

  这里我们直接对Expression委托类型进行赋值,将四个匿名方法赋值给了Expression的实例,这样我们不必在为每种计算分别写不同的方法了,这样写看上去是不是比之前美观简洁了许多,但是实际代码并没有减少许多,我们可不可以有什么方法,直接写一个表达式传给Calculate方法呢?这里就要引入今天的另一个主角——lambda表达式,说到lambda表达式,你并不要害怕,其实lambda表达式并不是一个全新的概念,它只不过是升级了的匿名方法罢了,很多初学者看到lambda表达式,完全无法想象他与匿名方法,以及委托有什么关系,又会误认为它是一个全新的概念,其实并不是,它只不过是一段更为简洁的匿名方法罢了,也可以它只不过是一段更为简洁的执行语句罢了。下面我们就来通过代码来对比lambda表达式,匿名方法,以及方法+委托

(1)最原始的一种,定义方法,通过委托传递或调用方法

//自定义一个委托
public delegate int Expression(int a, int b);
class Program
{
static void Main(string[] args)
{
Expression ex = Add;
Calculate(ex, , );
//或者直接这样写
//Calculate(Add, 10, 25);
Console.ReadKey();
} static int Add(int a, int b)
{
return a + b;
}
static int Divide(int a, int b)
{
return a / b;
}
static int subtract(int a, int b)
{
return a - b;
}
static int multiply(int a, int b)
{
return a * b;
}
static void Calculate(Expression ex, int a, int b)
{
Console.WriteLine(ex(a, b) + "\n");
}
}

(2)第二种,也就是最上面写的那种,通过委托传递匿名方法

//自定义一个委托
public delegate int Expression(int a, int b);
class Program
{
static void Main(string[] args)
{
Expression add = delegate (int a, int b) { return a + b; };
Expression subtract = delegate (int a, int b) { return a - b; };
Expression multiply = delegate (int a, int b) { return a * b; };
Expression divide = delegate (int a, int b) { return a / b; };
Calculate(add, , );
} static void Calculate(Expression ex, int a, int b)
{
Console.WriteLine(ex(a, b) + "\n");
}
}

(2)第三种,进一步简化匿名方法,直接传递lambda表达式

    public delegate int Expression(int a, int b);
class Program
{
static void Main(string[] args)
{
Calculate((a, b) => a + b, , );
Calculate((a, b) => a - b, , );
Calculate((a, b) => a * b, , );
Calculate((a, b) => a / b, , );
} static void Calculate(Expression ex, int a, int b)
{
Console.WriteLine(ex(a, b) + "\n");
}
}

  可能你对第三部的写法还是有些不太明白,为什么(a, b) => a + b连参数类型和返回值都没有了,还是可以编译和执行,系统是如何知道这个表达式的参数类型和返回值的呢?这里我们在方法Calculate定义的时候第一个参数是Expression类型,所以我们既然已经在定义委托时已经规定了Expression的参数个数,参数类型,以及返回值类型,那么我们在写lambda表达式就不必在重复定义类型了,所以参数类型与返回值类型不用重复定义,只是需要注意到是参数个数,当lambda表达式只有一个参数时,表达式的”()“括号可以省略,无参和多参括号都不可以省。

  这就是从委托到lambda表达式一步步的演化,我们的理解也一步步的加深,其实这就是lambda表达式就是C#这门语言不断进化的产物,无论它怎样进化,变得多么简单,它最终的本质还是逃不过那几个字:一段可以被传递的执行语句

委托学习总结(二)匿名方法和lambda表达式的更多相关文章

  1. C#中的委托,匿名方法和Lambda表达式

    简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=.答案是6个Firs ...

  2. 写的非常好的文章 C#中的委托,匿名方法和Lambda表达式

    简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个Fir ...

  3. (转)C#中的委托,匿名方法和Lambda表达式

    简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个Fir ...

  4. [No0000134]C#中的委托,匿名方法和Lambda表达式

    简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个Fir ...

  5. 【转】C#中的委托,匿名方法和Lambda表达式

    简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个Fir ...

  6. C#学习之初步理解委托、事件、匿名方法和Lambda

    最经在学习LinqtoSql,然后扯到Lambda表达式,然后扯到匿名方法,然后扯到委托,最后扯到事件处理...后来发现对委托这个概念和事件处理这个过程理解得不是很清晰,遂得一下学习笔记.那里说得不对 ...

  7. c#委托中的匿名方法和lambda表达式

    一.一般委托方式 Func<int, int, int> AddMethodHander; public unName() { AddMethodHander += AddMethod; ...

  8. 匿名方法和Lambda表达式

    匿名方法本质上是一传递给委托的代码块,是使用委托的另一种方法. 规则: 1.匿名方法中不能使用跳转语句跳至次匿名方法的外部,反之亦然:匿名方法外部的跳转语句也不能跳转到匿名方法的内部: 2.在匿名方法 ...

  9. 匿名方法和Lambda 表达式

    Overview 当你使用委托的时候,有时候是否会感觉到略微有些麻烦,尽管委托已经极大的减少了我们的工作量,比如,有一个方法,只需要使用一次,仅仅是传递给委托,我们就要定义一次他,这未免太 " ...

随机推荐

  1. CharacterRangeTable

    转载:https://github.com/jacoco/jacoco/wiki/CharacterRangeTable This page discusses a not yet available ...

  2. sql 递归树

    with CTE as ( -->Begin 一个定位点成员 select ID, PersonName,ParentID,cast(PersonName as nvarchar(max)) a ...

  3. 前端通信:ajax设计方案(一)---集成核心请求

    报告,我要说话!xp被历史淘汰了,IE6 say goodbye了,太TM开心了,从此不要兼容IE6了,哈哈哈哈哈哈 报告,我要说话!IE这sb为啥不早点被杀掉呢,找工作听说要兼容IE,立马软了,唉唉 ...

  4. iptables关键学习总结

    iptables技术推荐参考这位仁兄的博客:http://www.zsythink.net/archives/category/%E8%BF%90%E7%BB%B4%E7%9B%B8%E5%85%B3 ...

  5. [C语言]类型限定词const解析

    作为C90增加的一个受限类型关键字,const赋予了它修饰的变量一个新属性——不变性,如果一个变量声明中带有关键字const,则无法通过赋值.增减运算来修改该变量的值. 一.指针与const结合 co ...

  6. OOAD之面向对象设计原则

    学习这个设计模式 真的觉得很抽象,只有自己多多的领会! 在很多时候,很多的知识都会觉得讲起来是很矛盾的. 本章目标 1 掌握内聚度和耦合度的概念 2 掌握面向对象设计原则  (一)如何衡量软件设计的质 ...

  7. Tomcat,JBoss与JBoss Web

    最近接触到应用服务器JBoss,此外JBoss Web与Tomcat也同为web服务器,便查阅资料对三者进行比较,供大家参考. 一.Tomcat Tomcat 服务器是免费开源的Web 应用服务器.支 ...

  8. 安装sublime text2 for ubuntu

        Add our Sublime Text 2 Ubuntu PPA using the following commands: sudo add-apt-repository ppa:webu ...

  9. [转]Lost parameter value during SQL trace in EF Core DbParameter 为 问号 ?

    本文转自:https://stackoverflow.com/questions/44202478/lost-parameter-value-during-sql-trace-in-ef-core 问 ...

  10. [转]微信小程序支付简单小结与梳理

    本文转自:https://www.cnblogs.com/onetwo/p/6667424.html 公司最近在做微信小程序,被分配到做支付这一块,现在对这一块做一个简单的总结和梳理. 支付,对于购物 ...