Lambda表达式 - 浅谈
概述:
只要有委托参数类型的地方,就可以使用 Lambda表达式.在讲述Lambda表达式之前,有必要先简要说明一下 委托中的"匿名方法":
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace AnonymousMethod {
class Program {
static void Main(string[] args) {
string midStr = " middle ";
Func<string, string> strDel = delegate(string strParam) { //通过匿名方法代替事先写好的方法来实例化委托.
strParam += midStr;
strParam += " end.";
return strParam;
}; string result = strDel("begin ");
Console.WriteLine(result);
//begin middle end.
}
}
}
对于只执行一次,而且方法的实现比较简单,我们使用匿名方法代替事先写好的方法,然而从 C#3.0开始,我们可以使用 Lambda表达式来代替匿名方法.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace LambdaExpression {
class Program {
static void Main(string[] args) {
string midStr = " middle ";
Func<string, string> strDel = strParam => { //使用Lambda表达式.
strParam += midStr;
strParam += " end.";
return strParam;
}; string result = strDel("begin ");
Console.WriteLine(result);
//begin middle end.
}
}
}
Lambda运算符"=>"的左边列出了需要的参数;右边定义了赋予Lambda变量的方法的实现代码.
参数
如果只有一个参数,只写出参数名就可以.如上面的例子,因为委托类型定义了一个 string参数,所以 strParam的类型就是string类型.
如果使用多个参数,就要把参数名称放在括号中.如
//多个参数.
Func<double, double, double> twoParam = (x, y) => x + y;
double result = twoParam(, );
Console.WriteLine(result);
//
多行代码
如果Lambda表达式只有一条语句,在方法块内就就不需要花括号和return语句,因为编译器或添加一条隐式的return语句.如上例子.但是如果Lambda表达式的实现代码需要多条语句时,就必须添加花括号和return语句,例如:
string midStr = " middle ";
Func<string, string> strDel = strParam => { //Lambda表达式的实现代码有多条语句.
strParam += midStr;
strParam += " end.";
return strParam;
};
Lambda表达式外部的变量
Lambda表达式可以访问Lambda表达式块外部的变量,如
int someVal = ;
Func<int, int> f = x => x + someVal;
int retult = f();
Console.WriteLine(retult);
//6.
代码中的第2行,编译器会在后台生成一个匿名类,有一个构造函数来传递外部变量,如
public class AnonymousClass {
private int someVal;
public AnonymousClass(int someVal) {
this.someVal = someVal;
}
public int AnonymousMethod(int x) {
return x + someVal;
}
}
Lambda表达式 - 浅谈的更多相关文章
- Lambda 表达式浅谈- 01
已经有一段时间没有发布博文了... 今天就写一写lambda的一些简单的使用方法 Lambda 在Msdn 上的描述: Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数. 通过使用 ...
- 浅谈Lambda表达式详解
lambda简介 lambda运算符:所有的lambda表达式都是用新的lambda运算符 " => ",可以叫他,“转到”或者 “成为”.运算符将表达式分为两部分,左边指定 ...
- 浅谈lambda表达式<最通俗易懂的讲解
Java8发布已经有一段时间了,这次发布的改动比较大,很多人将这次改动与Java5的升级相提并论.Java8其中一个很重要的新特性就是lambda表达式,允许我们将行为传到函数中.想想看,在Java8 ...
- 浅谈sql 、linq、lambda 查询语句的区别
浅谈sql .linq.lambda 查询语句的区别 LINQ的书写格式如下: from 临时变量 in 集合对象或数据库对象 where 条件表达式 [order by条件] select 临时变量 ...
- 【转】.NET(C#):浅谈程序集清单资源和RESX资源 关于单元测试的思考--Asp.Net Core单元测试最佳实践 封装自己的dapper lambda扩展-设计篇 编写自己的dapper lambda扩展-使用篇 正确理解CAP定理 Quartz.NET的使用(附源码) 整理自己的.net工具库 GC的前世与今生 Visual Studio Package 插件开发之自动生
[转].NET(C#):浅谈程序集清单资源和RESX资源 目录 程序集清单资源 RESX资源文件 使用ResourceReader和ResourceSet解析二进制资源文件 使用ResourceM ...
- 浅谈-Lambda
Lambda简化了匿名委托的使用,让你让代码更加简洁,优雅.据说它是微软自c#1.0后新增的最重要的功能之一. 简介: lambda运算符:所有的lambda表达式都是用新的lambda运算符 &qu ...
- 浅入浅出Lambda表达式
大家在开发中会经常看到也会经常使用lambda表达式. 园子里也有很多详解lambda表达式的文章,多是从横向来讲述. 但lambda表达式到底如何变成现在这个样子,表达式的形式到底代表什么含义,这些 ...
- C#在泛型类中,通过表达式树构造lambda表达式
场景 最近对爬虫的数据库架构做调整,需要将数据迁移到MongoDB上去,需要重新实现一个针对MongoDB的Dao泛型类,好吧,动手开工,当实现删除操作的时候问题来了. 我们的删除操作定义如下:voi ...
- [C#]6.0新特性浅谈
原文:[C#]6.0新特性浅谈 C#6.0出来也有很长一段时间了,虽然新的特性和语法趋于稳定,但是对于大多数程序猿来说,想在工作中用上C#6.0估计还得等上不短的一段时间.所以现在再来聊一聊新版本带来 ...
随机推荐
- JS-商品图片点击轮换
//小图预览区域图片轮换键const LIWIDTH=62;var moveCount=0;document.getElementById("btForward").onclick ...
- 【回忆1314】第一次用AngularJS
1.创建指令的4种方式(ECMA) var appModule = angular.module('app', []); appModule.directive('hello', function() ...
- 关闭Centos的自动更新
昨天跟老板汇报,提到我们的linux服务器每天自动更新,老板大发雷霆,说生产系统不能够这样,非常不安全,一个师兄也提到他原来在移动的时候,服务器更新也是很谨慎的事情.看来我的思维太技术了,不够全面,所 ...
- javaWeb实现使用邮箱邮件找回密码功能
JSP+Jmail+JavaBean 发邮件(转)2010-08-23 18:052007年04月14日 14:32/* * SendMail.java * * Created on 2007年3月3 ...
- Ftp协议Socket实现
原来用WebRequest来传输文件,被人鄙视了.就弄个Socket版的,支持Active,Passive模式. 带事件日志,有时间的人可以拿去做C#版的flashfxp. public class ...
- $ npm install opencv ? 你试试?! 在windows环境下,使用node.js调用opencv攻略
博主之前写过一篇文章<html5与EmguCV前后端实现——人脸识别篇>,叙述的是opencv和C#的故事.最近在公司服务器上更新了一套nodejs环境,早就听闻npm上有opencv模块 ...
- 文本阴影:text-shadow
例如: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...
- java调优随记-java对象大小
在java中,基本数据类型的大小是固定.但是java对象的大小是不固定的,需要通过计算. 在java中,一个空对象(没有属性和方法的对象)在堆中占用8byte,比如 Object obj = new ...
- Linux系统编程(26)——守护进程
Linux系统启动时会启动很多系统服务进程,比如inetd,这些系统服务进程没有控制终端,不能直接和用户交互.其它进程都是在用户登录或运行程序时创建,在运行结束或用户注销时终止,但系统服务进程不受用户 ...
- Java---设计模块(值对象)
★ 场景和问题 在Java开发时,需要来回交换大量的数据,比如要为方法传入参数,也要获取方法的返回值,该如何能更好的进行数据的交互? ★ 基本的编写步骤 ◎第1步:写一个类,实现可序列化(如果以后数据 ...