了解由函数指针到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. 基于Scrapy-Redis和docker技术在单机上构建分布式爬虫

    准备工作: 安装docker https://www.docker.com/docker-ubuntu 选择ce版本 通过docker pull 下载基础镜像,ubuntu16.04, redis, ...

  2. Oracle 定时器

    我的代码 declare job number; begin dbms_job.submit( JOB=>job, what=>'addBytime;',// 这里要写分号,不然容易出错. ...

  3. 虚拟机提示:无法打开内核设备“\\.\Global\vmx86”: 系统找不到指定的文件

    虚拟机提示:无法打开内核设备“\\.\Global\vmx86”: 系统找不到指定的文件 Win 10 vmware12 无法打开内核设备“\\.\Global\vmx86”: 系统找不到指定的文件. ...

  4. Unity3D使用OpenFileDialog后崩溃

    http://ask.unitymanual.com/question/24922 找了很久,原来是我的dll文件引错了,名字都一样,应该引用unity安装目录下的System.Window.Form

  5. xampp 忘记密码的处理方式.

    网上看到一些方法: 大部分是第一种:  方法一 这个方法, 我使用的时候没有生效. -------------- 后来看到另外一种方法 .  直接替换user表的三个文件.  这个方法成功了. xam ...

  6. C# Windows IPSEC监控(仅此一家,别无分店)

    Windows IPSEC监控,使用C#编写,输出为一行字符串,可以按照既有IPSEC规则生成模板 using System; using System.Diagnostics; using Syst ...

  7. 2016 多校联赛7 Joint Stacks (优先队列)

    A stack is a data structure in which all insertions and deletions of entries are made at one end, ca ...

  8. Spring Boot 揭秘与实战(九) 应用监控篇 - 自定义监控端点

    文章目录 1. 继承 AbstractEndpoint 抽象类 2. 创建端点配置类 3. 运行 4. 源代码 Spring Boot 提供的端点不能满足我们的业务需求时,我们可以自定义一个端点. 本 ...

  9. react-native 自定义 下拉刷新 / 上拉加载更多 组件

    1.封装 Scroller 组件 /** * 下拉刷新/上拉加载更多 组件(Scroller) */ import React, {Component} from 'react'; import { ...

  10. 操作cookie篇

    1.设置cookie setcookie(key,value); 2.设置cookie有效期(默认值0,浏览器关闭失效,PHP_INT_MAX最大值,永久不失效,time()-1,删除cookie) ...