理解Lambda表达式和闭包
了解由函数指针到Lambda表达式的演化过程

Lambda表达式的这种简洁的语法并不是什么古老的秘法,因为它并不难以理解(难以理解的代码只有一个目的,那就是吓唬程序员)
#include "stdafx.h"
using namespace System; typedef void(*FunctionPointer)(System::String ^str); void HelloWorld(System::String ^str)
{
Console::WriteLine(str);
Console::ReadLine();
} int main(array<System::String ^> ^args)
{
FunctionPointer fp = HelloWorld;
fp("Hello World");
return ;
}
函数指针
using System;
using System.Collections.Generic;
using System.Text; namespace CharpFunctionPointer {
class Program { delegate void FunctionPointer(string str); static void Main(string[] args) {
FunctionPointer fp = HelloWorld;
fp("Hello World!");
} static void HelloWorld(string str) {
Console.WriteLine(str);
Console.ReadLine();
}
} }
委托
using System;
using System.Collections.Generic;
using System.Text; namespace CharpFunctionPointer {
class Program { delegate void FunctionPointer(string str); static void Main(string[] args) {
FunctionPointer fp = delegate (string s) {
Console.WriteLine(s);
Console.ReadLine();
};
fp("Hello World!");
}
} }
匿名委托
using System;
using System.Collections.Generic;
using System.Text; namespace CharpFunctionPointer {
class Program { delegate void FunctionPointer(string str); static void Main(string[] args) {
FunctionPointer fp =
s => Console.WriteLine(s); fp("Hello World!");
Console.ReadLine();
}
}
}
Lambda表达式

using System;
using System.Collections.Generic;
using System.Text; namespace CharpFunctionPointer {
class Program { static void Main(string[] args) {
Action<string> fp = s => Console.WriteLine(s); fp("Hello World!");
Console.ReadLine();
}
}
}
将Lambda表达式赋值给一个预定义的泛型委托
Lambda表达式和闭包

using System;
using System.Collections.Generic;
using System.Text;
using System.Linq; namespace LambdaClosure {
class Program { static void Main(string[] args) {
UsesClosure();
} static void UsesClosure() {
string toFind = "ed";
var words = new string[] {
"ended","friend","closed","potato"
}; var matches = words.Select(s => s.Contains(toFind));
foreach(var str in matches) {
Console.WriteLine(str);
}
Console.ReadLine();
}
}
}
使用本地变量toFind就会通知编译器生成一个闭包(或包装器类),这样,toFind就不会成为"未定义"

柯里化(Currying)

using System;
using System.Collections.Generic;
using System.Text;
using System.Linq; namespace LambdaCurry {
class Program { static void Main(string[] args) {
Func<int,int,int> longLambda = (x,y) => x + y;
Console.WriteLine(longLambda(,)); //currying
Func<int,Func<int,int>> curry = x => y => x + y;
Console.WriteLine(curry()()); Console.ReadLine();
}
}
}
LambdaCurry
理解Lambda表达式和闭包的更多相关文章
- C# 从CIL代码了解委托,匿名方法,Lambda 表达式和闭包本质
前言 C# 3.0 引入了 Lambda 表达式,程序员们很快就开始习惯并爱上这种简洁并极具表达力的函数式编程特性. 本着知其然,还要知其所以然的学习态度,笔者不禁想到了几个问题. (1)匿名函数(匿 ...
- lambda表达式和闭包
lambda表达式和闭包 熟悉的Javascript或者Ruby的同学,可能对另一个名词:闭包更加熟悉.因为一般闭包的示例代码,长得跟lambda差不多,导致我也在以前很长一段时间对这两个概念傻傻分不 ...
- 浅析匿名函数、lambda表达式、闭包(closure)区别与作用
浅析匿名函数.lambda表达式.闭包(closure)区别与作用 所有的主流编程语言都对函数式编程有支持,比如c++11.python和java中有lambda表达式.lua和JavaScript中 ...
- python3 入门 (三) 函数与lambda表达式、闭包
函数 是组织好的.可重复使用的.用来实现单一或相关联功能的代码段. 函数代码块以def关键词开头,后接函数标识符名称和圆括号() 任何传入参数和自变量必须放在圆括号中间.圆括号之间可以用于定义参数 函 ...
- 理解Lambda表达式
1.什么是Lambda表达式 Lambda表达式是一个匿名方法,通常在LINQ中被用来创建委托 简单来说.它是一个没有声明,没有访问修饰符,没有返回值.甚至没有名字的方法. 2.为什么我们需要使用La ...
- LINQ to Objects系列(3)深入理解Lambda表达式
Lambda表达式是学好LINQ很重要的一个知识点,后面的LINQ查询中会大量地使用到Lambda表达式.这篇文章从以下几点进行总结. 1,Lambda表达式的前世今生 2,Lambda表达式的实际运 ...
- Java中的函数式编程(三)lambda表达式
写在前面 lambda表达式是一个匿名函数.在Java 8中,它和函数式接口一起,共同构建了函数式编程的框架. lambda表达式乍看像是匿名内部类的一种语法糖,但实际上,它们是两种本质不同的事物 ...
- C#中委托、匿名函数、Lambda表达式的一些个人理解
0x01定义一个委托,相当于定义一个可以存储方法的特殊变量类型 下面我们看具体的代码,通过代码更好理解 delegate void IntMethodInvoker(int x); 这行代码就是声明一 ...
- Spark中Lambda表达式的变量作用域
通常,我们希望能够在lambda表达式的闭合方法或类中访问其他的变量,例如: package java8test; public class T1 { public static void main( ...
随机推荐
- BOM浏览器操作对象
BOM定义 一.定时器 1) 定时器1:setInterval() 2)一次性定时器 二.offset.scroll.client
- 使用DLL在进程间共享数据
0x01 DLL在进程间共享数据理论 1.可以在Dll中使用#pragma data_seg建立共享类型的数据段将需要共享的数据分离出来,放置在一个独立的数据段里,并把该段的属性设置为共享,从而实现不 ...
- 《图解HTTP》读书笔记(转)
reference:https://www.cnblogs.com/edisonchou/p/6013450.html 目前国内讲解HTTP协议的书是在太少了,记忆中有两本被誉为经典的书<H ...
- 安装和配置HyperServer
总述 安装和配置HyperServer非常简单.直接. uniGUI安装程序在.. \uniGUI\HyperServer\bin\文件夹(\bin64\用于64位二进制文件)下分发了HyperSer ...
- PAT乙级 1016. 部分A+B (15)
题目传送:https://www.patest.cn/contests/pat-b-practise/1016 正整数A的“DA(为1位整数)部分”定义为由A中所有DA组成的新整数PA.例如:给定A ...
- HDU 2147 kiki's game(博弈经典题)
题目传送:http://acm.hdu.edu.cn/showproblem.php?pid=2147 Problem Description Recently kiki has nothing to ...
- 单交换机划分VLAN配置
实验要求:相同vlan的主机能够通信,不同vlan的主机不能通讯 拓扑如下: 涉及内容有: 1.端口trunk模式设置 2.VTP的创建和设置 3.vlan的划分 配置如下: A enable 进入特 ...
- WSDL 文档-一个简单的 XML 文档
WSDL 文档是利用这些主要的元素来描述某个 web service 的: <portType>-web service 执行的操作 <message>-web service ...
- 常见Web应用程序漏洞
不完善的身份验证措施 .这类漏洞包括应用程序登录机制中的各种缺陷,可能会使攻击者破解保密性不强的密码.发动蛮力攻击或完全避开登录. 不完善的访问控制措施.这一问题涉及的情况包括:应用程序无法为数据和功 ...
- JAVA多线程Thread与Runnable
一.Runnable Runnable为一个之包含一个run方法的接口 public class MyRunnable implements Runnable{ @Override //表示:预示重写 ...