当前位置: 首页 > 编程日记 > 正文

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

相关文章:

Python爬虫入门教程 57-100 python爬虫高级技术之验证码篇3-滑动验证码识别技术

滑动验证码介绍 本篇博客涉及到的验证码为滑动验证码&#xff0c;不同于极验证&#xff0c;本验证码难度略低&#xff0c;需要的将滑块拖动到矩形区域右侧即可完成。 这类验证码不常见了&#xff0c;官方介绍地址为&#xff1a;https://promotion.aliyun.com/ntms/act/captchaI…

FlameScope 更高级全面的火焰图

FlameScope 更高级全面的火焰图 文章目录FlameScope 更高级全面的火焰图安装步骤安装问题fix使用方式网飞(Netflix)开发的火焰图工具能够更好得呈现出一段时间内的服务器on/off cpu 的热力图。安装步骤 $ git clone https://github.com/Netflix/flamescope $ cd flamescope $ …

sql 基础--mysql 5 (6)

12.子查询 子查询进行过滤 mysql> select msg from pw_luck where name wang5-> ; ------ | msg | ------ | 1001 | | 1000 | | 1000 | | 100 | | 100 | ------ 5 rows in set (0.03 sec)mysql> select uid from pw_luck where msg in (select msg from pw_luck w…

Java项目:就业管理系统设计和实现(java+springboot+ssm)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 就业管理系统: 该毕业设计采用了spring boot&#xff0c;spring&#xff0c;spring mvc&#xff0c;mybatis作为后端技术框架&#xff0c;这些组合稳定抗打&#xff0c;前端使用了layui&#xff0c;界面美观…

算法设计与分析之循环与递归

前言&#xff1a;循环与递归可以说是算法设计中最基本但却也是最重要的工具方法。循环和递归对于学习过高级程序设计语言的人来说都并不陌生&#xff0c;但还是有必要仔细的探究一下循环和递归之间的相似和区别。循环与递归最大的相似之处莫不是在于他们在算法设计中的工具作用…

面向对象与软件工程---团队作业1

1.队伍名称&#xff1a; 遥遥万里&#xff08;还有很长路要走的意思&#xff09; 2.队员信息&#xff1a; 陈雄&#xff08;组长&#xff09; 学号&#xff1a;1700509024 博客园链接&#xff1a;https://www.cnblogs.com/bearchan/ 廖鹏辉 学号&#xff1a;1700802007 博客园…

从paxos到raft zab,为何raft能够“独领风骚”

文章目录RAFT出现的缘由RAFT 的实现STATE MACHINELog Replicated State MachineLeader Election基本角色关键变量基本选举过程Log Replicated基本概念基本操作SafetyLog Replication: Consistency checkLeader Election: Leader Completeness总结RAFT 和 ZAB 的对比参考文献:阅…

Java项目:前台+后台精品水果商城系统设计和实现(java+Springboot+ssm+mysql+jsp+maven)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 一、项目简述 本系统主要实现的功能有&#xff1a; 前台用户的登录注册&#xff0c;水果商品的展示&#xff0c;水果的购物车&#xff0c; 购物车新增结算等等&#xff0c;银行卡的支付绑定&#xff0c;收货…

Android屏幕像素密度适配详解

讲到像素密度&#xff0c;我们先要搞明白什么是像素密度&#xff0c;像素密度的字面上的意思为手机屏幕上一定尺寸区域内像素的个数。在Android开发中&#xff0c; 我们一般会使用每英寸像素密度&#xff08;dpi&#xff09;这样一个单位来表示手机屏幕的像素密度&#xff0c;d…

如让自己想学不好shell编程都困难?

众所周知&#xff0c;shell是linux运维必备的技术&#xff0c;必须要掌握&#xff0c;但是shell语法复杂&#xff0c;灵活&#xff0c;网友掌握了语法也不知道如何应用到实际运维中&#xff0c;老男孩培训shell编程给所有linux运维人员带来了学好shell的法宝,老男孩培训2014最新…

sqlserver可将字符转成数字再进行sum,如果varchar类型中存放的都是数字

sqlserver语法&#xff1a; select sum(cast(score as int)) as score from 表名; 注意&#xff1a;int是整型&#xff0c;在实际操作中根据自己需要的类型转换。转载于:https://www.cnblogs.com/MisMe/p/10690748.html

LSM 优化系列(六)-- 【ATC‘20】MatrixKV : NVM 的PMEM 在 LSM-tree的write stall和写放大上的优化

文章目录LSM 问题背景MatrixKV 设计细节整体架构介绍Matrix Container介绍ReceiverRowTableCompactorSpace managementColumn Compaction介绍对于Column Compaction的总结读加速 Cross-row Hint SearchMatrixKv 写入完整流程MatrixKV 读取完整流程MatrixKV 性能总结这篇论文大家…

Java项目:前台+后台在线考试系统设计和实现(java+Springboot+ssm+mysql+jsp+maven)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 一、项目简述 本系统主要实现的功能有&#xff1a; 学生以及老师的注册登录&#xff0c;在线考试&#xff0c;错题查询&#xff0c;学生管理&#xff0c;问题管理&#xff0c;错题管理&#xff0c;错题查询…

修改nginx服务器类型

通常nginx服务器不隐藏服务器类型及版本信息 curl -I http://www.aaa.com 获取web服务器的类型和版本代码 HTTP/1.1 200 OK Server: nginx nginx/0.8.53 Date: Tue, 14 Dec 2010 08:10:06 GMT Content-Type: text/html Content-Length: 151 Last-Modified: Mon, 13 Dec 2…

JS 自带函数

JS数组方法汇总 array数组元素的添加和删除js数组元素的添加和删除一直比较迷惑&#xff0c;今天终于找到详细说明的资料了&#xff0c;先给个我测试的代码^-^var arr new Array();arr[0] "aaa";arr[1] "bbb";arr[2] "ccc";//alert(arr.leng…

Flink学习笔记:Operators之CoGroup及Join操作

本文为《Flink大数据项目实战》学习笔记&#xff0c;想通过视频系统学习Flink这个最火爆的大数据计算框架的同学&#xff0c;推荐学习课程&#xff1a; Flink大数据项目实战&#xff1a;http://t.cn/EJtKhaz 1. Window CoGroup与Join 1.1回顾RDBMS各种join 假设有两个表A和B 1.…

Rocksdb 的优秀代码(二)-- 工业级 打点系统 实现分享

文章目录前言数据结构选型打点代码设计耗时打点请求计数打点打点总结前言 一个完善的分布式系统一定是需要完善的打点统计&#xff0c;不论是对系统内核 还是 对系统使用者都是十分必要的。系统的客户需要直观得看到这个系统的性能相关的指标来决定是否使用以及如何最大化使用…

JVM中可生成的最大Thread数量

最近想测试下Openfire下的最大并发数&#xff0c;需要开大量线程来模拟客户端。对于一个JVM实例到底能开多少个线程一直心存疑惑&#xff0c;所以打算实际测试下&#xff0c;简单google了把&#xff0c;找到影响线程数量的因素有下面几个&#xff1a; -Xms intial java heap s…

Java项目:在线电影售票系统设计和实现(java+Springboot+ssm+mysql+jsp+maven)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 一、项目简述 前台&#xff1a; 1、正在上映的电影浏览查看。 2、影院信息浏览查看。 3、新闻咨询信息浏览查看。 4、地域信息查看切换。 5、用户注册登录。 6、电影排期查看。 7、在线选座生成…

matlab正态分布

normrnd(mu, sigma, m,n) 返回m x n的随机数&#xff0c;正态分布均值mu&#xff0c;标准差sigma。 mvnrnd(mu, sigma, m) 返回m个随机数&#xff08;点&#xff09;&#xff0c;是多元正太分布&#xff0c;mu是均值向量&#xff0c;sigma是协方差。 x normrnd(0,4,1,100000);…

MYSQL语句

-- 一、管理数据库-- 1.1 创建数据库CREATE DATABASE day15; SHOW DATABASES; CREATE TABLE student( id INT, NAME VARCHAR(20), age INT); -- 查看表SHOW TABLES; -- 二、管理数据-- 1.1插入数据&#xff08;insert into&#xff09;-- 需求&#xff1a; 往学生表插入数据INS…

Intel Optane PMEM 概览

文章目录前言基本架构编程模型PMDK接口架构接口概览pmdk 安装开发文档汇总PMEM性能官方性能实测性能前言 随着以PCM 为存储单元的3D XPoint 非易失存储介质 不断精进的工艺&#xff0c;以及 上层硬件协议栈的飞速发展&#xff0c;为非易失内存这样硬件的出现提供了技术工艺基础…

Java项目:新闻发布系统(java+Springboot+ssm+mysql+maven)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 一、项目简述 功能&#xff1a; 区分为管理员用户和普通用户&#xff0c;管理员用户能删除评论&#xff0c; 调整新闻显示/隐藏&#xff0c;修改新闻&#xff0c;删除普通用户&#xff0c;普通用户能 登陆浏…

Linux下搭建Lotus Domino集群

Linux下搭建Lotus Domino 集群本文内容是Linux平台下Lotus Domino服务器部署案例&#xff08;http://chenguang.blog.51cto.com/350944/1334595&#xff09;的另一个模块&#xff0c;所以大家首先要有以上基础之后然后继续实验。集群是 Lotus Domino Server 提供的最重要特性之…

Centos下卸载openjdk并安装自定义jdk

1、查看是否安装了openjdk java -version 2、查看需要卸载的openjdk信息&#xff0c;其中只需要删除红色框标记的地方 rpm -qa | grep java 3、删除openjdk rpm -e --nodeps 需要删除的java组件 4、创建文件夹java mkdir java 5、到官网下载linux版本的jdk&#xff08;如果不能…

pmdk -- libpmemlog 介绍

文章目录1. libpmemlog 应用背景2. libpmemlog 使用方式2.1 基本接口2.2 接口使用3. Libpmemlog 性能3.1 write sys call 性能3.2 libpmemlog 性能1. libpmemlog 应用背景 本文介绍的是英特尔 傲腾持久化内存 pmdk中 的一个持久化日志的库。 我们正常系统中会将日志 形成一个…

Java项目:家庭财务管理系统(java+Springboot+ssm+mysql+maven)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 一、项目简述 功能&#xff1a; 家庭财务管理系统&#xff0c;具有收入统计&#xff0c;支出统计&#xff0c;汇总报 表&#xff0c;工资录入&#xff0c;其他收入等录入开支信息&#xff0c;echart图标插 …

(原创)c++primer(第五版)--1.3 注释简介

注释可以帮助人类读者理解程序。注释通常用于概述算法&#xff0c;确定变量的用途&#xff0c;或者结束晦涩难懂的代码段。编译器会忽略注释&#xff0c;因此注释对程序的行为或者性能不会有任何影响。 虽然编辑器会忽略注释&#xff0c;但读者并不会。即使系统文档的其他部分已…

BZOJ 1503 郁闷的出纳员(splay)

题目链接&#xff1a;http://www.lydsy.com/JudgeOnline/problem.php?id1503 题意&#xff1a;给出一个数列&#xff08;初始为空&#xff09;&#xff0c;给出一个最小值Min&#xff0c;当数列中的数字小于Min时自动删除。四种操作&#xff1a;&#xff08;1&#xff09;数列…

javascript ES6 新特性之 扩展运算符 三个点 ...

对于 ES6 新特性中的 ... 可以简单的理解为下面一句话就可以了&#xff1a; 对象中的扩展运算符(...)用于取出参数对象中的所有可遍历属性&#xff0c;拷贝到当前对象之中。 作用类似于 Object.assign() 方法&#xff0c;我们先来看一下 Object.assign() 方法&#xff1a; Obje…