Lambda表达式学习记录
Lambda表达式可以简化C#编程的某些方面,用法非常灵活。因此也不容易掌握。
下边是我学Lambda表达式的一点记录。
1、Lambda表达式是与委托紧密联系的。只要有委托参数类型的地方,就可以使用Lambda表达式。
Lambda表达式的运算符是=>。运算符左边列举出了需要的参数,右边定义了赋予Lambda变量的方法的实现代码。下面这段代码是一个最简单的使用方法:
public class MyLambda
{
public void disPlay()
{
string mid = ",middle part,";
Func<string, string> lambda = param =>
{
param += mid;
param += "and this was added to the string";
return param;
};
Console.WriteLine(lambda("Start of string"));
}
}
Func<string, string>是一个委托类型。包含两个参数:一个输入的string和一个输出的string.
parm是输入参数,所以他的类型可以认为是string类型的(当然很多地方会出现没有名字的类型的)。
运算符=>右边表示一个方法,这个方法没有名字。这个方法赋予了变量lambda。
在本例中,通过Console.WriteLine(lambda("Start of string"));向lambda方法传递参数“Start of string”.经处理后会有这样的输出:
Start of string,middle part,and this was added to the string。
所以我想这样理解:Lambda表达式表示是一个函数的另一种写法。运算符=>左边是输入,右边是函数体。函数体需不需要返回值,由接收这个函数定义的lambda表达式的委托决定。
2、Lambda表达式的参数。
lambda表达式如果只有一个参数,只写出参数名就行了。下边的lambda表达式使用了参数s,因为委托类型定义了一个string类型。所以s的类型就是string。实现函数体的代码调用了String.Format()方法返回一个字符串,在调用委托是就直接把字符串输出了:
Func<string, string> oneParam = s =>
{
return String.Format("Change To UpperCase {0}", s.ToUpper());
};
Console.WriteLine( oneParam("abc"));
注:Func的用法见上一篇博文.Func<string,string>是一个系统定义的带有一个输入和一个输出的委托。
如果委托有多个参数,就要把参数放到括号中,如下:
Func<double, double, double> twoParam = (x, y) =>
{
return x * y;
};
3、单行代码和多行代码
如果Lambda表达式只有一条语句,在方法块内就不需要花括号和return语句了,编译器会自动添加一条隐式的return语句。如上边的两个表达式可以分别表示为:
Func<string, string> oneParam = s => String.Format("Change To UpperCase {0}", s.ToUpper());
Func<double, double, double> twoParam = (x, y) => x * y;
但是如果Lambda表达式实现代码需要多条语句时,就必须添加花括号和return语句了。如第一个例子的代码。
4、Lambda表达式的外部变量
Lambda表达式可以使用外部变量。但使用时应该注意些问题:
先看下边的代码:
int someVar = 5;
Func<int, int> f = x => x + someVar;
someVar = 10;
Console.WriteLine(f(5));
输出应该是x+5还是x+10呢?运行下发现输出15(x+10).即修改外部变量someVar后,会使用外部变量的新值。
对于表达式x => x + someVar; 编译器会创建一个匿名类,他有一个构造函数来传递外部变量。该构造函数取决于从外部传递过来的变量个数。对于上边这个例子,我们可以认为构造函数接受一个int,匿名类包含了一个匿名方法,其实现代码和返回类型有lambda表达式定义:
public class AnonymousClass
{
private int someVar;
public AnonymousClass(int someVar)
{
this.someVar = someVar;
}
public int AnonymousMethod(int x)
{
return x + someVar;
}
}
使用Lambda表达式时,调用该方法(AnonymousMethod(int x)),会创建匿名类的一个实例(相当于new AnonymousClass(somevar)),并传递调用该方法时的变量的值。
转:http://www.soaspx.com/dotnet/csharp/csharp_20110103_7031.html
Lambda表达式学习记录的更多相关文章
- C# Lambda 表达式学习之(三):动态构建类似于 c => c.Age == null || c.Age > 18 的表达式
可能你还感兴趣: 1. C# Lambda 表达式学习之(一):得到一个类的字段(Field)或属性(Property)名,强类型得到 2. C# Lambda 表达式学习之(二):LambdaExp ...
- C# Lambda 表达式学习之(四):动态构建类似于 c => c.Age == 2 || c.Age == 5 || c => c.Age == 17 等等一个或多个 OrElse 的表达式
可能你还感兴趣: 1. C# Lambda 表达式学习之(一):得到一个类的字段(Field)或属性(Property)名,强类型得到 2. C# Lambda 表达式学习之(二):LambdaExp ...
- C# Lambda表达式学习笔记
本笔记摘抄自:https://www.cnblogs.com/leslies2/archive/2012/03/22/2389318.html,记录一下学习过程以备后续查用. 一.Lambda ...
- java lambda表达式学习笔记
lambda是函数式编程(FP,functional program),在java8中引入,而C#很早之前就有了.在java中lambda表达式是'->',在C#中是‘=>’. 杜甫说:射 ...
- java 8 中lambda表达式学习
转自 http://blog.csdn.net/renfufei/article/details/24600507 http://www.jdon.com/idea/java/10-example-o ...
- python函数和lambda表达式学习笔记
1. python函数 不同于其他语言,python支持函数返回多个值 为函数提供说明文档:help(函数名)或者函数名.__doc__ def str_max(str1, str2): ''' 比较 ...
- Lambda 表达式 学习
最近几天在学习Lambda,给我的理解就是一个匿名函数的升级版,代码极大可能的简洁了很多,不需要像以前一样必须使用众多的代码才能实现相关功能. 慢慢积累学习,将Java 8的相关知识进行一个学习. 用 ...
- Python中lambda表达式学习
lambda只是一个表达式,函数体比def简单很多. lambda的主体是一个表达式,而不是一个代码块.仅仅能在lambda表达式中封装有限的逻辑进去. lambda表达式是起到一个函数速写的作用.允 ...
- C#Lambda表达式学习日记
Lambda表达式只是用更简单的方式来写匿名方法,彻底简化了对.NET委托类型的使用. 现在,如果我们要使用泛型 List<> 的 FindAll() 方法,当你从一个集合去提取子集时,可 ...
随机推荐
- 微信小程序之特殊效果及功能
一.下拉刷新效果 假设页面为index文件,那么代码如下: index.json: { "enablePullDownRefresh": true } index.js: //下拉 ...
- [转]ORA-28001: the password has expired解决方法
本文转自:http://blog.csdn.net/btt2013/article/details/54862420 参考文献:http://www.zhetao.com/content259 后台报 ...
- python学习之类和实例的属性;装饰器@property
无论是类还是实例,一切皆是对象. Python是强动态语言,和java在这点上有所不同. class Ab(): a = 666 # 定义类对象Ab,自带属性a,值为666 # 使用Ab.__dict ...
- Day7:掌握APICloud应用管理相关服务的配置使用和相关API,包括:应用发布、版本管理、云修复、闪屏广告等。理解APICloud APP优化策略和编码规范;了解APICloud多Widget管理机制和SuperWebview的使用
主要内容: 1. 应用发布 1.1 云编译 1.2 全包加密 网页全包加密:对网页中全包的html,css,javascript代码进行加密,加密后的网友代码都是不可读的,并且不能通过常用的格式化工具 ...
- ASP.NET MVC 获得 view 中的HTML并将其中的内容自动转换成繁体中文。
一.思路 1.获得 asp.net mvc 输出的 html 的字符串. 2.将拿到的 html 字符串中的简体中文转换成繁体中文. 3.输出 html. 二.实现 1.扩展 RazorView 视图 ...
- CentOS如何挂载U盘(待更新)
使用Linux系统时,经常需要用到U盘,下面介绍以下如何再CentOS上挂载U盘. 首先,切换到root用户. 首先,切换到root用户. 首先,切换到root用户. 重要的事情说三遍,很多同学都说, ...
- Hive配置文件hive-site.xml
<configuration> <property> <name>hive.metastore.warehouse.dir</name> <val ...
- ZUI分页器的使用案例(ECLIPSE SMS项目)
不足:并未编写导出功能 HTML代码: <form action="${basePath}/SMSLogList.cwai" method="post" ...
- mysql中的坑
1,MySQL建表中double类型不能限制数据长度! 2,……
- JAVA基础之——三大特征、接口和抽象类区别、重载和重写区别、==和equals区别、JAVA自动装箱和拆箱
1 java三大特征 1)封装:即class,把一类实体定义成类,该类有变量和方法. 2)继承:从已有的父类中派生出子类,子类实现父类的抽象方法. 3)多态:通过父类对象可以引用不同的子类,从而实现不 ...