1.匿名方法

在学习委托时,我们知道委托实例至少要绑定一个方法才能使用,而调用委托实际上是调用了它所关联地方法。一般来说,需要定义一个与委托签名相符的方法,并使之与委托变量关联。如以下代码:

Action deleg=new Action(CallMethod);//声明并实例化委托变量

private static void CallMethod()//与委托关联的方法

{.........}

会发现以上写法并不简洁,因此引入了“匿名方法”,它不需要命名,用一个delegate关键字代表方法的名字,没有访问修饰符,也不需要返回类型。

例如上面的例子可以简写如下:

Action deleg=delegate()

{........};

当委托既有参数又有返回值的时候,匿名方法中就也要相应定义参数,如果委托的签名中有返回值,则在匿名方法中就直接使用return返回即可,如下实例:

Func<int,int,int> f=delegate(int x,int y)

{ return x+y;};

int result=f(1+2);//调用委托

其实上例所用的委托的原型如下:delegate TResult Func<in T1,in T2,out TResult>(T1 x,T2 y);

如果委托要关联地方法在代码中没有重复使用,使用匿名方法会非常方便,当方法在代码中多个地方都用到,就不应该在使用匿名方法。

2.Lambda表达式

Lambda表达式其实就是更为简洁的匿名方法表示法,以“=>”作为分隔符,其左边为匿名方法的参数列表,右边为匿名方法的语句,即:(参数列表)=><语句>

对于没有参数的委托,Lambda表达式如下:()=><语句>

2.1 Lambda表达式用于给委托变量赋值

(1)对于没有参数,返回值为void类型的委托

Action a=()=>{/*........*/};

如果“=>”右边只有一句代码,则可以省略大括号,写出:Action a=()=>Console.WriteLine("");

(2)对于有参数的委托

Action<string,int> a=(string name,int age)=>Console.WriteLine("");

由于Lambda表达式可以根据委托来识别参数类型,所以可以省略(string name,int age)中的参数类型。

(3)对于有返回值的委托(非void类型),则直接用return 返回即可。

Func<int,int ,int> a=(a,b)=>{return a*b;};

如果“=>”后边只有一句代码,可以吧return和大括号省略,如下所示:

Func<double, string> a=(n)=>n.ToString("C2");

2.2 Lambda表达式用于参数传递

比如.NET类库的许多扩展方法以及LINQ表达式都可以使用Lambda表达式传递参数。示例代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Test
{
#region 定义类型
public class Student
{
public string Name { get; set; }
public int Age { get; set; }
public DateTime Date { get; set; }
}
#endregion class Program
{
static void Main(string[] args)
{
List<Student> stus = new List<Student>();
stus.Add(new Student { Name = "小王", Age = , Date = new DateTime(, , ) });
stus.Add(new Student { Name = "小刘", Age = , Date = new DateTime(, , ) });
stus.Add(new Student { Name = "小红", Age = , Date = new DateTime(, , ) }); // 将学员的入学日期按升序排序
var res = stus.OrderBy(stu => stu.Date);
Console.WriteLine("学员的入学日期按升序排序:");
foreach (Student s in res)
{
Console.WriteLine("姓名:{0},年龄:{1},入学日期:{2:yyyy-M-d}", s.Name, s.Age, s.Date);
}
Console.ReadKey();
}
}
}

以上代码使用了OrderBy扩展方法的以下重载:

public static IOrderedEnumerble<TSource> OrderBy<TSource,TKey>(this IEnumerble<TSource> source,Func<TSource,TKey> keySelector);

在调用时,主要关注keySelector参数,因为第一个参数是要扩展的类型,由编译器调用。keySelector参数是Func<TSource,TKey>,输入类型为TSource,TKey是要返回的值,OrderBy方法将根据TKey来进行排序。实例中,stu会自动识别为Student类型,“=>”右边直接将stu的Date属性值返回,OrderBy方法通过调用传递给keySelector参数的委托来获取每个Student实例的Date属性值,以便进行排序。

匿名方法与Lambda表达式的更多相关文章

  1. 从匿名方法到 Lambda 表达式的推演过程

    Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数. 通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数. 以上是msdn官网对Lambda 表达式 ...

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

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

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

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

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

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

  5. 匿名方法,Lambda表达式,高阶函数

    原文:匿名方法,Lambda表达式,高阶函数 匿名方法 c#2.0引入匿名方法,不必创建单独的方法,因此减少了所需的编码系统开销. 常用于将委托和匿名方法关联,例如1. 使用委托和方法关联: this ...

  6. Fun<>,匿名方法,Lambda表达式 冒泡排序C#

    大头文 分享,进步 冒泡排序C#实现,使用委托,包括三种方式:Fun<>,匿名方法,Lambda表达式 冒泡排序是一种简单的排序方法,适合于小量数字排序,对于大量数字(超过10个),还有更 ...

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

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

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

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

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

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

  10. 进阶系列(8)——匿名方法与lambda表达式

    一 匿名方法的介绍     匿名方法是为了简化委托的实现,方便调用委托方法而出现的,同时,匿名方法也是学好lambda表达式的基础.在委托调用的方法中,如果方法只被调用一次,这个时候我们就没有必要创建 ...

随机推荐

  1. JavaScript 事件 编程练习

    编程练习 使用JS完成一个简单的计算器功能.实现2个输入框中输入整数后,点击第三个输入框能给出2个整数的加减乘除. 提示:获取元素的值设置和获取方法为:例:赋值:document.getElement ...

  2. cocoapods 命令

    1.使用CocoaPods a  新建一个项目,名字cocoapods

  3. Visual Studio 2015 前端开发工作流

    Visual Studio 2015 CTP 5,全称为 Visual Studio 2015 Community Technology Preview 5,意为社区技术预览版,之前的版本为:Visu ...

  4. 在 Windows 上安装Rabbit MQ 指南

    rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.他遵循Mozilla Public License开源协议.采用 Erlang 实现的工业级的消息队列(MQ)服务器. Ra ...

  5. spark 笔记

    官网 http://spark.apache.org/ 安装:http://dblab.xmu.edu.cn/blog/spark-quick-start-guide/ 教程 http://www.c ...

  6. [.net 面向对象程序设计进阶] (22) 团队开发利器(一)简单易用的代码管理工具VSS

    [.net 面向对象程序设计进阶] (22) 团队开发利器(一)简单易用的代码管理工具VSS 本篇要点:在进阶篇快要结束的时候说说源代码管理器,我们的开发,不是一个人可以完成的事,团队协作很重要,而且 ...

  7. .Net组件程序设计之远程调用(二)

    .Net组件程序设计之远程调用(二) 激活模式 引用封送对象激活类型两种, 一种是客户端激活类型,一种是服务器端激活. 客户端激活对象 客户端激活方式:当客户端创建一个远程对象时,客户端得到的是一个新 ...

  8. Android-Activity-Dialog theme touch outsize

    最近遇到一个蛋疼的问题: 一个Activity,主题设置成 Dialog 然后点击外面要求这个Activity 不能关闭. 这下好了,直接在 style 的 theme 里面加一个属性就好了. 加上去 ...

  9. VS web项目 基于IIS调试和模拟域名调试

    1.安装IIS 2.注册.net framework 到IIS 打开程序-运行-cmd:输入一下命令重新注册IISC:\WINDOWS\Microsoft.NET\Framework\v4.0.303 ...

  10. Spring学习记录(十)---使用FactoryBean配置Bean

    之前学了,配置bean可以用普通全类名配置.用工厂方法配置,FactoryBean又是什么呢 有时候配置bean要用到,IOC其他Bean,这时,用FactoryBean配置最合适. FactoryB ...