了解由函数指针到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表达式和闭包的更多相关文章

  1. C# 从CIL代码了解委托,匿名方法,Lambda 表达式和闭包本质

    前言 C# 3.0 引入了 Lambda 表达式,程序员们很快就开始习惯并爱上这种简洁并极具表达力的函数式编程特性. 本着知其然,还要知其所以然的学习态度,笔者不禁想到了几个问题. (1)匿名函数(匿 ...

  2. lambda表达式和闭包

    lambda表达式和闭包 熟悉的Javascript或者Ruby的同学,可能对另一个名词:闭包更加熟悉.因为一般闭包的示例代码,长得跟lambda差不多,导致我也在以前很长一段时间对这两个概念傻傻分不 ...

  3. 浅析匿名函数、lambda表达式、闭包(closure)区别与作用

    浅析匿名函数.lambda表达式.闭包(closure)区别与作用 所有的主流编程语言都对函数式编程有支持,比如c++11.python和java中有lambda表达式.lua和JavaScript中 ...

  4. python3 入门 (三) 函数与lambda表达式、闭包

    函数 是组织好的.可重复使用的.用来实现单一或相关联功能的代码段. 函数代码块以def关键词开头,后接函数标识符名称和圆括号() 任何传入参数和自变量必须放在圆括号中间.圆括号之间可以用于定义参数 函 ...

  5. 理解Lambda表达式

    1.什么是Lambda表达式 Lambda表达式是一个匿名方法,通常在LINQ中被用来创建委托 简单来说.它是一个没有声明,没有访问修饰符,没有返回值.甚至没有名字的方法. 2.为什么我们需要使用La ...

  6. LINQ to Objects系列(3)深入理解Lambda表达式

    Lambda表达式是学好LINQ很重要的一个知识点,后面的LINQ查询中会大量地使用到Lambda表达式.这篇文章从以下几点进行总结. 1,Lambda表达式的前世今生 2,Lambda表达式的实际运 ...

  7. Java中的函数式编程(三)lambda表达式

    写在前面 lambda表达式是一个匿名函数.在Java 8中,它和函数式接口一起,共同构建了函数式编程的框架.   lambda表达式乍看像是匿名内部类的一种语法糖,但实际上,它们是两种本质不同的事物 ...

  8. C#中委托、匿名函数、Lambda表达式的一些个人理解

    0x01定义一个委托,相当于定义一个可以存储方法的特殊变量类型 下面我们看具体的代码,通过代码更好理解 delegate void IntMethodInvoker(int x); 这行代码就是声明一 ...

  9. Spark中Lambda表达式的变量作用域

    通常,我们希望能够在lambda表达式的闭合方法或类中访问其他的变量,例如: package java8test; public class T1 { public static void main( ...

随机推荐

  1. python 创建flask项目方法

    Flask是一个基于Python的web框架,它的设计目的是提供Web开发所需的最小功能子集. Flask与别的框架(尤其是采用其他编程语言的框架)的不同之处在于:它没有绑定诸如数据库查询或者表单处理 ...

  2. 配置JAVA 环境变量

    首先 下载好JDK后 打开环境变量配置 配置JAVA_HOME: C:\Program Files\Java\jdk1.8.0_144(也就是jdk下载后的文件夹)   之后配置PATH:这时用到%J ...

  3. Python 区分方法和函数

    def func(): print("我是函数") class Foo: def chi(self): print("我是吃") # print(func) # ...

  4. SQL注入之Sqli-labs系列第十八关(基于错误的用户代理,头部POST注入)

    开始挑战第十八关(Header Injection - Uagent field - Error based) 常见的HTTP注入点产生位置为[Referer].[X-Forwarded-For].[ ...

  5. Codeforce 9C - Hexadecimal's Numbers

    One beautiful July morning a terrible thing happened in Mainframe: a mean virus Megabyte somehow got ...

  6. 高级数据结构及应用 —— 使用 bitmap 进行字符串去重

    bitmap 即为由单个元素为 boolean(0/1, 0 表示未出现,1 表示已经出现过)的数组. 如果C/C++ 没有原生的 boolean 类型,可以用 int 或 char 来作为 bitm ...

  7. [Data Structure] Stack Implementation in Python

    We can realize a Stack as an adaptation of a Python List. S.push(e)=L.append(e) S.pop()=L.pop() S.to ...

  8. python学习之路02

    1.python的数据类型有:Number String List Truple Sets Dictionary . 数字类型:int float bool complex 2.不可变数据:数字 字符 ...

  9. HDU 2058:The sum problem(数学)

    The sum problem Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  10. 安装Ubuntu16.04与windows10双系统后,如何修改启动默认设置

    在安装了Ubuntu16.04系统之后,系统会默认自启动Ubuntu16.04,而我们大多数情况下可能都在使用windows系统,不修改默认设置,不经意间便会启动了Ubuntu16.04,通过我的经历 ...