前面讲过委托的知识,本次由委托过渡到Lambda表达式,更易于理解。

  class Program
{
static void Main(string[] args)
{
int[] intA = { , , , };
ProcArray(intA, AddOne);
foreach (int i in intA)
{
Console.Write(i + " ");
} Console.ReadKey();
}
private static void ProcArray(int[] intArra, ProcIntArrayHandler procHandler)
{
for (int i = ; i < intArra.Length; i++)
{
intArra[i] = procHandler(intArra[i]);
}
} private static int AddOne(int procNum)
{
return procNum + ;
}
private static int AddTwo(int procNum)
{
return procNum + ;
}
}
public delegate int ProcIntArrayHandler(int procNum);

委托

其中ProcIntArrayHandler是委托类型,表示处理一个整数,并返回对该整数处理的结果。在ProcArray方法中,可用procHandler参数所引用的实例来处理数组中的每个int元素。
注:委托是引用类型,不必用new实例化。
 
在c#1.0中,需要委托实例化,如:ProcArray(intA, new ProcIntArrayHandler(AddTwo));该语法在c#高版本中仍支持。
 
匿名方法
c#2.0引入了匿名方法,使用了较简洁的语法创建委托,如:ProcArray(intA, delegate(int i) { return i + 20; });
 
Lambda
由以上代码可知,是将AddOne和AddTwo转换成委托类型,它们的参数类型与返回类型是和委托类型兼容,
我们注意到private static int AddOne(int procNum)的声明比方法主体return procNum + 1;冗长多了,仅仅只是为了转成委托类型。
c#3.0引入Lambda表达式,语法更简单,如:ProcArray(intA, (int i) => i + 10);
lambda语句组成:形参=>代码块。改语句包含了AddOne方法的大多数信息: 形参和代码块,方法名称和修饰符省略了。没有方法名,所以匿名方法和lambda表达式都称为匿名函数。
由于编译器能检查出参数类型和返回值,故还可以再次省略:如ProcArray(intA,i=>i+10);
注:如果是个无参数Lambda语句,则必须使用圆括号'()',如果是有多个参数也必须使用圆括号。

从委托、匿名方法到Lambda的更多相关文章

  1. 用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树

    这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力.曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托,表达式树这些应用.今天我尝试用简单的方法叙述一下,让大家在五 ...

  2. 委托学习笔记后续:泛型委托及委托中所涉及到匿名方法、Lambda表达式

    引言: 最初学习c#时,感觉委托.事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托.事件学习笔记.今天重新温故委托.事件,并且把最近学习到和委托相关的匿名方法.Lambda表达式及泛型委托记录 ...

  3. 转帖:用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树

    用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树 这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力.曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托 ...

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

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

  5. 委托、匿名方法、Lambda表达式的演进

    摘自:"http://www.cnblogs.com/eagle1986/archive/2012/01/19/2327358.html 假设给我们一个泛型对象List<T>,T ...

  6. 委托,匿名方法,Lambda,泛型委托,表达式树

    一.委托:完成一个委托应分三个步骤://step01:首先用delegate定义一个委托;public delegate int CalculatorAdd(int x, int y);//step0 ...

  7. 泛型委托及委托中所涉及到匿名方法、Lambda表达式

    泛型委托及委托中所涉及到匿名方法.Lambda表达式 引言: 最初学习c#时,感觉委托.事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托.事件学习笔记.今天重新温故委托.事件,并且把最近学习到 ...

  8. c#-委托,匿名方法,lambda表达的关系

    什么是委托: 包含单个方法的委托和函数指针是相似的,不同的是,委托是面向帝乡的并且是类型安全的 声明委托类型: delegate void mydel(int x); 声明委托和声明方法差不多,两个不 ...

  9. .NET Framework System.Array.Sort 数组类,加深对 IComparer、IComparable 以及泛型委托、匿名方法、Lambda 表达式的理解

    本文内容 自定义类 Array.Sort 参考资料 System.Array.Sort 有很多对集合的操作,比如排序,查找,克隆等等,你可以利用这个类加深对 IComparer.IComparable ...

  10. C#中分别对委托、匿名方法、Lambda表达式、Lambda表达式树以及反射执行同一方法的过程进行比较。

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

随机推荐

  1. python 文件拷贝

    用python实现了一个小型的自动发版本的工具.这个“自动发版本”有点虚, 只是简单地把debug 目录下的配置文件复制到指定目录,把Release下的生成文件复制到同一指定,过滤掉不需要的文件夹(. ...

  2. 最长子串 FZU2118

    http://acm.fzu.edu.cn/problem.php?pid=2128 分析:利用strstr()函数将每个字串在原串中的首尾位置存储一下,再将首尾从小到大排一下序.(写着写着就感觉和看 ...

  3. win32api 获取文件版本信息

    #coding:utf-8 myPath="C:\\ime" import os from win32api import GetFileVersionInfo, LOWORD, ...

  4. unreal3的坐标系统和vector/rotator

    unreal3的坐标系有点奇葩,属于[z轴向上的左手坐标系]: 1.左手食指指前方,x正向 2.大拇指指上方,z正向 3.中指指右方,y正向 若以我们人头摆正时来参考: 1.目视的是前方,x正向 2. ...

  5. Python学习第八天(os)

    os主要是实现文件夹的创建和管理功能 os.mkdir(path) 创建目录 os.chdir(path)改变当前工作目录 os.fchdir() 通过文件描述符改变工作目录 os.chroot() ...

  6. <T>的用法

    ///类型转换 template <class T1,class T2> vector<T2> ObjcetsSwap(vector<T1> objects) { ...

  7. 本地调试webapi

    1.新建iis站点,路径关联到代码站点下D:\work\易解科技\程序源码\YQJ\trunk\YQJOpenAPI\YQJOpenAPI 2.vs以管理员身份启动 3.附加到进程 w3wp.exe ...

  8. EF 实践

    一.CodeFirst 1.新建MVCEFManger(业务层)项目 在该项目下引入entityframework 安装包(用来生成数据库或者实体) PM> install-package en ...

  9. VS2010中项目配置引入GDAL

    在上一篇文章中,小编介绍了使用VS2010编译GDAL的方法,但是上文中仅仅完成了编译的工作,但是在具体是使用过程中,需要先对VS2010的项目进行配置,引入GDAL的库.配置GDAL的的过程如下: ...

  10. MyBatis源码分析(1)-MapConfig文件的解析

    1.简述 MyBatis是一个优秀的轻ORM框架,由最初的iBatis演化而来,可以方便的完成sql语句的输入输出到java对象之间的相互映射,典型的MyBatis使用的方式如下: String re ...