了解由函数指针到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. 学react的第一天

    属性 class = className for = htmlFrom jsx语法被编译了,所以可以在return里写html标签 react的属性 constructor(props){ super ...

  2. Cracking The Coding Interview 2.5

    这题的思想来自于http://hawstein.com/posts/2.5.html,重新实现了一下 用hash来记录循环的起点 //Given a circular linked list, imp ...

  3. Linux音频驱动学习之:(1)ASOC分析

    一.音频架构概述 (1)ALSA是Advanced Linux Sound Architecture 的缩写,目前已经成为了linux的主流音频体系结构,想了解更多的关于ALSA的这一开源项目的信息和 ...

  4. Jmeter响应中中文乱码怎么解决

    在jmeter的bin目录下有一个jmeter.properties的文件,打开它,搜索sampleresult.default.encoding,把它的注释打开,也就是把最前面的#去掉,改成samp ...

  5. 杭电多校第三场 A Ascending Rating

    Problem Description Before the start of contest, there are n ICPC contestants waiting in a long queu ...

  6. LINQ(数据库操作增、删、改及并发管理)

    本文将演示如何通过 Entity Framework 数据模型创建.修改.删除数据库记录. Customer cust = new Customer() { CustomerID = "LA ...

  7. Final阶段第1周/共1周 Scrum立会报告+燃尽图 06

    作业要求[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2485] 版本控制:https://git.coding.net/liuyy08 ...

  8. error_log

    对于我们做php开发的人员,上了生产环境,一定要把相关debug,display_errors错误提示等关掉.谁还难免不犯个错呢?这样能防止非致命性报错下,导致项目路径.数据库等信息泄漏. 问:那么问 ...

  9. BUG_sql未解决bug

    [SQL]truncate table org_cert;受影响的行: 0时间: 0.021s [Err] 1055 - Expression #1 of ORDER BY clause is not ...

  10. 计数SQL,查找单据总量和按季度查找单据总量

    --查找单据总量 select COUNT(1) as '表XXXXXX数据量' from XXXXXXwith(nolock) --按季度查找单据总量 select count(1) as '表XX ...