C#拉姆达(=)表达式
前言:
之前小猪曾经分享过自己对C#委托的一点理解 其实在使用委托的过程中我们会大量的使用拉姆达(=>)表达式
介绍:
"Lambda表达式"是一个匿名函数,是一种高效的类似于函数式编程的表达式,Lambda简化了开发中需要编写的代码量。它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型,支持带有可绑定到委托或表达式树的输入参数的内联表达式。所有Lambda表达式都使用Lambda运算符=>,该运算符读作"goes to"。Lambda运算符的左边是输入参数(如果有),右边是表达式或语句块。Lambda表达式x => x * x读作"x goes to x times x"。
自C#3.0开始,就可以使用这种代码赋予委托。只要有委托参数类型的地方,就可以使用Lambda表达式。
ps:lambda表达式的语法比匿名方法简单。如果所调用的方法有参数,且不需要参数,匿名方法的语法就比较简单,因为这样不需要提供参数。
namespace TimeBookMVC4.TEST
{class Program{static void Main(string[] args){string mid = ", middle part,";Func<string, string> lambda = param =>{param += mid;param += " and this was added to thes string.";return param;};Console.WriteLine(lambda("Start of string"));}}
}
lambda运算符"=>"的左边列出了需要的参数,右边定义了赋予lambda变量的方法的实现代码。
参数
Lambda表达式有集中定义参数的方式。如果只有一个参数,只写出参数名就足够了。下面的Lambda表达式使用了参数s。因为委托类型顶了一个string参数,所以s的类型就是string。实现代码调用Strign.Format()方法来返回一个字符串,在调用该委托时,就把字符串写到控制台上:
Func<string, string> oneparam = s => String.Format("change uppercase {0}",s.ToUpper());Console.WriteLine(oneparam("test"));
如果委托使用多个参数,就把参数名放在花括号中。这里参数x和y的类型是double,由Func<double,double,double>委托定义:
Func<double, double, double> twoparam = (x, y) => x * y;Console.WriteLine(twoparam(3,2));
为了方便,可以在花括号中给变量名添加参数类型:
Func<double, double, double> twoparam = (double x,double y) => x * y;Console.WriteLine(twoparam(3,2));
多行代码
如果Lambda表达式只有一条语句,在方法块内就不需要花括号和return语句,因为编译器会添加一条隐式的return语句。
Func<double, double> square = x => x * x;
添加花括号、return语句和分号是完全合法的,通常这比不添加这些括号更容易阅读:
Func<double, double> square = x => {return x*x;}
但是,如果在Lambda表达式的实现代码中需要多条语句,就必须添加花括号和return语句:
Func<string, string> lambda = param =>{param += mid;param += " and this was added to thes string.";return param;};
Lambda表达式外部的变量
通过Lambda表达式可以访问Lambda表达式块外部的变量。这是一个非常好的功能,但如果未正确使用,也会非常危险。
在下面的示例中,Fun<int,int>类型的Lambda表达式需要一个int参数,返回一个int。该Lambda表达式的参数用变量x定义。实现代码还访问了Lambda表达式外部的变量someVal。只要不认为在调用f时,Lambda表达式创建了一个以后使用的新方法,这似乎么有什么问题。看看这个代码块,调用f的返回值应是x加5的结果,但似乎不是这样:
int someVal = 5;Func<int, int> f = x => x + someVal;
假定以后要修改变量someVal,于是调用Lambda表达式时,会使用someVal的新值。调用f(3)的结果是10:
someVal =7;
Console.WriteLine(f(3));
特别是,通过另一个线程调用Lambda表达式时,我们可能不知道进行了这个调用,也不知道外部变量的当前值是什么。
现在我们也许会奇怪,如何在Lambda表达式的内部访问Lambda表达式外部的变量。为了理解这一点,看看编译器在定义Lambda表达式时做了什么。对于Lambda表达式x=>x+someVal,编译器会创建一个匿名类,他有一个构造函数来传递外部变量。该构造函数取决于从外部传递进来的变量个数。对于这个简单的例子,构造函数接收一个int。匿名类包涵一个匿名方法,其实现代码、参数和返回类型有Lambda变大事定义:
public class AnonymousClass{private int someVal;public AnonymousClass(int someVal){this.someVal = someVal;}public int AnonymousMethod(int x){return x + someVal;}}
使用Lambda表达式并调用该方法,会创建匿名类的一个实例,并传递调用该方法时变量的值。
参考:《C#高级编程(第七版)》
转载于:https://www.cnblogs.com/smallerpig/p/3646178.html
C#拉姆达(=)表达式相关推荐
- SqlSugar常用查询实例-拉姆达表达式
SqlSugar支持拉姆达表达式查询,匿名对象参数等,相对还是比较方便好用的. 一.查询列表: //查询列表SqlSugarClient db = SugarContext.GetInstance() ...
- java1.8 Lambda拉姆达表达式深入探究
当我们遇到下面情况时: SingleObj.getInstance().setRunnable(new Runnable() {@Overridepublic void run() {} }); 编译 ...
- C# 匿名方法和拉姆达表达式
"` "`代码如下: using System; using System.Collections.Generic; using System.Linq; using System ...
- 匿名函数 和 拉姆达表达式
匿名函数 匿名方法是创建与特定委托实例相关联的未命名代码块的一种方法.可以通过在代码块后面跟上delegate关键字来创建匿名方法. delegate void print();delegate st ...
- 拉姆达表达式学习(2)
本文转载自:http://www.cnblogs.com/zhouji432600/archive/2010/05/30/1747383.html 在.net3.5里面,委托的定义和实现被大大的简化了 ...
- 拉姆达表达式 追加 条件判断 ExpressionFuncT, bool
拉姆达表达式 追加 条件判断 Expression<Func<T, bool>> 2014/11/13 14:47:59 虫虫飞520 程序员俱乐部 我要评论(0) ...
- 拉姆达表达式(Lambda Expressions)
让我们先看一个简单的拉姆达表达式: x=>x/2 这个表达式的意思是:x为参数,对x进行相应的操作后的结果作为返回值. 通过这个拉姆达表达式,我们可以看到: 这个表达式没有任何类型信息,但这并不 ...
- 拉姆达表达式学习(1)
我曾经遇到一个项目,项目里面需要经常对一系列的同类型集合进行操作,如对集合进行增加元素,删除集合的指定索引的元素等等. 我们可以使用ArrayList来进行.如 1 ArrayList stringL ...
- 拉姆达表达式相关知识
拉姆达表达式 拉姆达表达式是创建匿名函数的另一种方法.因此,拉姆达表达式可以赋值给委托.虽然主要在操作LINQ中使用拉姆达表 达式,但是这种表达式也适用于委托和事件. 拉姆达表达式运算符 ...
最新文章
- kubernetes API Server 权限管理实践
- 【Android 热修复】热修复原理 ( 类加载分析 | 分析 PathClassLoader 源码 | 分析 BaseDexClassLoader 源码 | 分析 PathDexList 源码 )
- linux Makefile编写的整理
- C/S+P2P网络模型(一)--聊天
- hdu 3395(费用流,二分图的最大权匹配)
- JAVA基础:Hibernate外键关联与HQL语法
- Java不可变类作为参数传递遇到的坑
- Java 类型和数据库类型怎么实现相互映射?
- LeetCode 24 Swap Nodes in Pairs (交换相邻节点)
- 牛客网【每日一题】7月30日题目精讲—Xor Path
- q超级会员都有什么鸿蒙,超级会员+豪华绿钻,超值四开!
- Python项目:生成微信好友头像拼接图
- C语言家谱管理程序,c语言的家谱——interesting~
- JavaScript replace()
- python 如何封装dll_python怎么封装dll
- java课程设计模拟画图_课程设计java画板模拟画图工具
- 如何给Exadata数据库一体机打补丁patching图解
- 范德堡大学计算机科学专业,美国范德堡大学的专业排名
- 夜神模拟器安装激活面具magisk教程
- 刚工作2年时15k运维工程师-简历
热门文章
- java的关键字和保留字_「Java」详解常见的53个关键字
- linux rm 提示io异常,Hadoop异常 java.io.IOException: Job status not available
- golang不编译.html,golang之条件编译
- 【数据库】兴唐第二十六节课作业
- c++ windows获得当前工作目录文件_基于linux下Python文件操作
- url 通配符解析成参数
- [微信小程序]组件化开发,以一个自定义模块框组件当做示例(附完整示例代码和效果图)
- iOS 13 如何删除SceneDelegate
- 2-Runtime objc_object objc_class
- C(第一个C程序) 和 C++ (第一个C++程序)对比碰撞