`
从此醉
  • 浏览: 1047819 次
  • 性别: Icon_minigender_1
  • 来自: US
社区版块
存档分类
最新评论

Lambda表达式基础篇

 
阅读更多

一.简介

       一个Lambda Expression(译为Lambda式)就是一个包含若干表达式和语句的匿名函数。可以被用作创建委托对象或表达式树类型。Lambda表达式对于编写 LINQ 查询表达式特别有用。

所有的Lambda式都使用操作符“=>“,表示“goes to (转变为)”。操作符左边部分是输入参数表,右边部分是表达式或语句块。接下来就看一下它的作用及用法。

二.何时用?

       在Framework 2.0 以前,声明委托的唯一方法是通过方法命名,从Framework 2.0 起,系统开始支持匿名方法。
通过匿名方法,可以直接把一段代码绑定给事件,因此减少了实例化委托所需的编码系统开销。
而在 Framework 3.0 开始,Lambda 表达式开始逐渐取代了匿名方法,作为编写内联代码的首选方式。总体来说,Lambda 表达式的作用是为了使用更简单的方式来编写匿名方法,彻底简化委托的使用方式。

那么接下来就通过几个实例来理解一下吧!

       用匿名方法

static void Main(string[] args)

 

         {

 

             Button btn = new Button();

 

             btn.Click+=delegate(objectobj,EventArgs e){

 

                 MessageBox.Show("HelloWorld !");

 

             };

 

         }

 

        使用Lambda表达式

[csharp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
 
  1. <span style="font-size:18px;">static void Main(string[] args)  
  2.   
  3.          {  
  4.   
  5.              Button btn = new Button();  
  6.   
  7.              btn.Click+=(object obj,EventArgs e)=>{  
  8.   
  9.                  MessageBox.Show("Hello World !");  
  10.   
  11.              };  
  12.   
  13.          }   
  14. </span>  


       通过以上对匿名函数和Lambda表达式的实战是否发现Lambda表达式其实就是一个匿名函数,但是它比匿名函数更容易让人理解,更简单,这也是它近年来发展迅速的原因吧!接下来就针对Lambda表达式来讲解一下。

三.表达式用法

1.表达式Lambda

    由一个计算表达式组成的一个Lambda式称之为表达式Lambda。表达式Lambda常被用于构造表达式树。一个表达式Lambda返回计算表达式运算的结果。

基本结构:

       (input parameters)=> expression

    如果只有一个输入参数时,括号可以省略。如果具有一个以上的输入参数,必需加上括号。

       (x) => x * x 等于 x => x * x

       (x, y) => x ==y

可以显式指定输入参数的类型

       (int x, string s)=> s.Length > x

也可以没有任何输入参数

        () =>SomeMethod1()

    上面这段代码在Lambda式中调用了一个方法。需要注意的是,如果在创建会被其他方使用的表达式树的时候,不宜在Lambda式中执行方法调用。比如:在SQL Server内执行。

一般来说,让一个方法在原先设计的上下文环境以外执行没有意义,也不能真正工作。

2.语句Lambda

    语句Lambda和表达式Lambda非常相似,只是语句被包含在大括号内:

        (input parameters)=> {statement;}

    大括号中的语句可以是任意多条,也可以写成多行(定义一个Lambda式也就是在定义一个匿名方法):

       TestDelegate myDel= n => { string s = n + " " + "World";

        Console.WriteLine(s);};

    当然语句Lambda跟匿名方法一样,无法用于创建表达式树。

3.类型猜测

    当编写一个Lambda式的时候,我们通常不需要明确指定输入参数的类型。因为编译器会根据Lambda体的实现,以及委托的定义来猜测类型。

    举例:如果要从一个List<int>中删除小于100的元素

        Llst.RemoveAll(i=> i < 100);//i会被猜测为int

通常的猜测规则如下:

       1. Lambda式必须包含与委托定义中相等数量的输入参数;

       2. 每个Lambda式的输入参数必须能够隐式转换成委托定义中所要求的输入参数;

       3.Lambda式的返回值必须能够隐式转换成委托定义中的返回值。

    注意:由于目前在common type system中还没有一个“Lambda式类型的类型。如果在有些场合提到“Lambda式的类型,那通常表示委托的定义或者是Expression<>类型。

4.Lambda式中的变量作用域

    在Lambda式定义中可以引用外部变量。只要是在定义处能够访问到的变量,都可以在Lambda式中引用。

Lambda式的定义仅仅是定义一个匿名方法,最终会生成一个委托对象。外部变量的引用将被捕获到委托对象内部,将会伴随委托对象的整个生命周期。在委托对象生命周期结束之前该变量都不会被垃圾回收。就算外部变量已经超过了原来的作用域,也还能继续在Lambda式中使用。所有会被引用的外部变量必须在Lambda式定义之前被显式赋值。见下例

delegatebool D();

delegatebool D2(int i);

classTest

{

Ddel;

D2del2;

publicvoid TestMethod(int input)

{

intj = 0;

//Initialize the delegates with lambda expressions.

//Note access to 2 outer variables.

//del will be invoked within this method.

del= () => { j = 10;return j > input; };

//del2 will be invoked after TestMethod goes out of scope.

del2= (x) => {return x == j; };

//Demonstrate value of j:

//Output: j = 0

//The delegate has not been invoked yet.

Console.WriteLine("j= {0}", j);

//Invoke the delegate.

boolboolResult = del();

//Output: j = 10 b = True//注意jdel的执行过程中被修改

Console.WriteLine("j= {0}. b = {1}", j, boolResult);

}

staticvoid Main()

{

Testtest = new Test();

test.TestMethod(5);

//Prove that del2 still has a copy of

//local variable j from TestMethod. //j的引用超出了原先定义的作用域

boolresult = test.del2(10);

//Output: True

Console.WriteLine(result);

Console.ReadKey();

}

}

    下面是关于变量作用域的规则:

        1.捕获的变量在委托的生命周期结束前都不会被垃圾回收;

        2.Lambda式内部定义的变量对外不可见;

        3. Lambda式无法直接捕获一个具有refout描述的参数变量;

        4.Lambda式中的return语句不会导致当前所在的方法返回;

        5.Lambda式中不允许包含会导致跳当前执行范围的gotobreak continue语句。

四.总结

       Lambda式可以说就是另外一种形式的匿名方法。用在某些地方,会使代码更加简洁。定义一个Lambda式本质上就是定义一个委托的实现体。

0
0
分享到:
评论

相关推荐

    C#连接数据库 —— (二)Linq To EF 的 lambda表达式使用 ,增删查改、判断、分组、排序

    可以看下面这篇文章: C#连接数据库 —— (一)实体框架(EF)的创建 (Linq To EF) Linq 使用 首先,我们创建数据库实体对象(下面的所有操作都用到这个对象): var DataModelsDb = new DbTrainEntities(); ...

    Java8:Lambda表达式增强版Comparator和排序

     在这篇教程里,我们将要去了解下即将到来的JDK 8(译注,现在JDK 8已经发布了)中的Lambda表达式——特别是怎样使用它来编写Comparator和对集合(Collection)进行排序。  这篇文章是Baeldung上的“Java ——...

    快速入门Java中的Lambda表达式

    Lambda作为函数式编程中的基础部分,在其他编程语言中早就广为使用,但在Java领域中发展较慢,直到java8,才开始支持Lambda。网上关于Lambda的教程很多,今天小编给大家分享一篇快速入手Lambda的教程。

    C++ function、bind以及lamda表达式

    本文是C++0x系列的第四篇,主要是内容是C++0x中新增的lambda表达式, function对象和bind机制。之所以把这三块放在一起讲,是因为这三块之间有着非常密切的关系,通过对比学习,加深对这部分内容的理解。在开始之间...

    Java基础最全笔记文档

    4. 日期与时间、日期类、包装类、正则表达式、Arrays 类、常见算法、Lambda 表达式 5. Collection集合、数据结构、List集合、泛型、Set集合、可变参数 6. 集合工具类Collections、Map集合、集合嵌套、不可变集合 7. ...

    计算机课程设计:C++、java和Python介绍与学习技巧.docx

    - 学习C++11及其以上的新特性,如auto、lambda表达式、智能指针等; - 学会使用调试工具,如gdb、valgrind等。 ## Java Java是一种广泛应用于企业级开发的高级编程语言,具有跨平台、安全、健壮等特点。学习Java...

    C# 表达式树Expression Trees的知识梳理

    本篇文章主要介绍了表达式树 Expression Trees的基础知识:Lambda 表达式创建表达式树;API 创建表达式树;编译表达式树;执行表达式树;修改表达式树等等,具有一定的参考价值,下面跟着小编一起来看下吧

    Android:Kotlin详细入门学习指南-基础语法(一).md

    3. 列举了一些Kotlin中常见的习惯用语,如创建数据类、使用lambda表达式操作集合、字符串插值、实例检查、遍历map/list、访问map、延迟加载等语法idiom。 4. 介绍了Kotlin的一些命名风格约定,如命名、空格使用、...

    Python 中的lambda函数介绍

    Lambda函数,即Lambda 表达式(lambda expression),是一个匿名函数(不存在函数名的函数),这篇文章主要介绍了Python lambda函数的基础知识,需要的朋友可以参考下

    C++11/14 线程中使用Lambda函数的方法

    在本篇文章中,主要介绍lambda函数在多线程中的使用。 先从下面的例子开始吧: #include #include int main() { std::thread t([]() { std::cout &lt;&lt; thread function\n; }); std::cout &lt;&lt; ...

    2023年最新c#入门介绍.md

    C#拥有许多强大的编程功能,如布尔条件、自动垃圾回收、标准库、组件版本管理、属性和事件、委托和事件管理、泛型、索引器、条件编译、多线程、LINQ和Lambda表达式等。 C#具有与Java非常相似的语法和编程风格,但在...

    Python之函数三千问(基础篇)

    lambda表达式: 递归函数:  嵌套函数: nonlocal和global: LEGB规则: 函数其它小用法: 函数是Python中重要的组成部分,它可以将代码封装起来,复用代码,可以很好的简化代码结构。 函数定义格式: 函数的内存...

    python教程(1) (基础篇)

    零基础带大家学习python编程语言采用windows+pycharm教学,python解释器版本为python3.7,macos和linux提供环境...字典,元组,集合集合,元组,列表,字典遍历集合,元组,列表,字典,推导式函数,递归,高阶函数,lambda表达式等

    轻松学C#(图解版)

    第三篇是应用技术篇,主要介绍的是异常处理、文件和流、委托、事件、Lambda表达式、命名空间、预处理器、程序集、运行时类型标识、反射、特性、泛型、LINQ和数据库开发等。 =======================================...

    Java8简明教程.pdf

    通过简单明了的代码示例,你将会学习到如何使用默认接口方法,Lambda表达式,方法引用和重复注解。看完这篇教程后,你还将对最新推出的API有一定的 了解,例如:流控制,函数式接口,map扩展和新的时间日期API等等...

    新Orcas语言特性-查询句法

    【原文地址】New “Orcas” Language ...Lambda表达式 今天的贴子要讨论另一个基础性的新语言特性:查询句法(Query Syntax)。 什么是查询句法(Query Syntax)? 查询句法是使用标准的LINQ查询运算符来表达查询时一个方

    ASP.NET3.5从入门到精通

    第一篇 .NET基础 第 1 章认识 ASP.NET 3.5 1.1 什么是ASP.NET 1.1.1 .NET 历史与展望 1.1.2 ASP.NET 与ASP 1.1.3 ASP.NET 开发工具 1.1.4 ASP.NET 客户端 1.1.5 ASP.NET 3.5 新增控件 1.1.6 ASP.NET 3.5 AJAX 1.2 ...

    java面试笔试资料包括JAVA基础核心知识点深度学习Spring面试题等资料合集.zip

    Java中Lambda表达式的使用.docx JAVA多线程之线程间的通信方式.docx Java注解详解.docx Java线程池.docx JDK1.8Stream操作.docx JDK8有新特性.docx JVM堆三代.docx JVM的垃圾回收机制详解和调优.docx Spring源码分析...

    ASP.NET 3.5 开发大全11-15

    第一篇 .NET基础 第1章 认识ASP.NET 3.5 1.1 什么是ASP.NET 1.1.1 .NET历史与展望 1.1.2 ASP.NET与ASP 1.1.3 ASP.NET开发工具 1.1.4 ASP.NET客户端 1.1.5 ASP.NET 3.5新增控件 1.1.6 ASP.NET 3.5 AJAX 1.2 .NET应用...

    ASP.NET 3.5 开发大全

    第一篇 .NET基础 第1章 认识ASP.NET 3.5 1.1 什么是ASP.NET 1.1.1 .NET历史与展望 1.1.2 ASP.NET与ASP 1.1.3 ASP.NET开发工具 1.1.4 ASP.NET客户端 1.1.5 ASP.NET 3.5新增控件 1.1.6 ASP.NET 3.5 AJAX 1.2 .NET应用...

Global site tag (gtag.js) - Google Analytics