上一篇博客主要是对委托和事件做了一小结,这篇是在上一篇博客的基础上对匿名函数和Lambda表达式小结。还是接着上一篇说起,在上一篇中也说了委托是一种数据结构,主要是解决让函数作为参数的问题。在使用委托时首先要声明代理,然后实例化,并将委托对象和已定义好的函数关联上,最后调用。这里与已定义好的函数关联的事情,如果函数是经常使用的也还好,如果不是经常使用的可能只调用一次,那这岂不是老费劲了。就是能不能在使用的时候定义下呢?于是乎有了匿名方法。

一、匿名方法的使用。

匿名方法的使用步骤和委托的使用步骤相同,只是实例化的格式不同。匿名方法的格式:

委托名 实例变量 =delegate(形参列表)

{

};

1.形参列表:参数列表应该和委托声明的匹配。若无可用()表示

2.返回值:返回值也是需要和委托类型的返回值匹配。

二、demo

和委托事件的例子一样,还是定义了一个Person类,并声明了委托EatFoodDelegate。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Delegate
{
//定义了一个从System.Delegate类派生的类
//也可以理解为一种数据类型 这种数据类型指向返回值为void 参数为Person对象的函数
//我们也可以把Person类理解为一种数据类型 只是它包含的是Name和Age
public delegate void EatFoodDelegate(Person p); public class Person
{ public string Name { get; set; } public int Age { get; set; } public Person(string name, int age)
{
Name = name;
Age = age;
} //既然委托是一数据类型和String一样,所以可以像声明String对象一样声明代理变量
public EatFoodDelegate eatFoodDelegate;
////之前是直接声明委托,现在是声明一个事件
//public event EatFoodDelegate EatFoodEventHandler; public void eating()
{ if (eatFoodDelegate != null)
{
eatFoodDelegate(this);
}
} }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Delegate
{
class Program
{
static void Main(string[] args)
{
Person chinesePerson = new Person("小明",);
//通过构造函数实例化对象
chinesePerson.eatFoodDelegate += new EatFoodDelegate(chineseEat);
chinesePerson.eating(); Console.WriteLine("--------------------------------------"); EatFoodDelegate EnglishEatPisaDelegate = delegate (Person p)
{
Console.WriteLine("I'm {0},I am {1} , I eat PiSa", p.Name, p.Age);
}; Person englishPerson = new Person("Ivan",);
englishPerson.eatFoodDelegate = delegate (Person p)
{
Console.WriteLine("I'm {0},I am {1} , I eat MianBao", p.Name, p.Age);
};
englishPerson.eatFoodDelegate += EnglishEatPisaDelegate;
englishPerson.eating();
Console.ReadLine();
}
static void chineseEat(Person p)
{
Console.WriteLine("我是{0},我今年{1}岁了,我吃馒头",p.Name,p.Age);
} } }

在上面代码中可以看到,实例化了两个Person对象,chinesePerson、englishPerson。如果按照上一博客委托的形式还是要new 一个委托对象,将委托和已定义好的函数关联起来。ps:注意委托调用和函数的位置关系。

我们使用匿名方法的方式实现了上一篇博客委托中要实现的功能。只是在englishPerson对象指定委托变量之前先声明了一个匿名方法,这个函数的声明周期也是很短的,然后又声明了一个匿名方法直接赋值给englishPerson的委托。

从上面的两个对象使用委托的比较,我们也可以看出匿名函数的好处。

1.代码结构方面

按照上一博客的方法,委托对象关联已有的方法,这个在代码结构上委托对象和方法是分离的,这个分离主义是代码位置的分离,实例化委托对象可能会在一个方法里面,而关联的方法会是另一个方法,虽然都是在一个类中,但在方法比较多的类中,影响代码检视,查看的时候还要跳转。而在匿名方法中,在调用的时候才会实例化,这样委托方法和调用离得就很近,很容易查看。

2.声明周期

对于一定义的方法,它是定义在类中,而匿名方法则是定义在调用的方法中,声明周期短。对于不经常调用,可能只在这一个地方使用的关联方法,没有必要定义在类中。

三、Lamdba表达式

对于上面的匿名方法还有一个好处就是简洁方便,也主要是帮助有懒癌的小伙伴们,那可能有懒癌到晚期的会问还有没有更简洁方便的能多简洁就多简洁,于是乎Lamdba表达式出现了,它也是匿名方法。下面是它的格式:

(参数列表)=>表达式或语句块

Lambda运算符:所有的lambda表达式都是用新的lambda运算符 " => ",可以叫他,“转到”或者 “成为”。运算符将表达式分为两部分,左边指定输入参数,右边是lambda的主体。还是使用同一个例子稍微改动下代码来说明下Lamdba表达式。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Delegate
{
class Program
{
static void Main(string[] args)
{
Person chinesePerson = new Person("小明",);
//通过构造函数实例化对象
chinesePerson.eatFoodDelegate += new EatFoodDelegate(chineseEat);
chinesePerson.eating(); Console.WriteLine("--------------------------------------"); Person englishPerson = new Person("Ivan",);
englishPerson.eatFoodDelegate = (Person p) => {
Console.WriteLine("I'm {0},I am {1} , I eat MianBao", p.Name, p.Age);
};
englishPerson.eatFoodDelegate += (Person p) => {
Console.WriteLine("I'm {0},I am {1} , I eat PiSa", p.Name, p.Age);
};
englishPerson.eating();
Console.ReadLine();
}
static void chineseEat(Person p)
{
Console.WriteLine("我是{0},我今年{1}岁了,我吃馒头",p.Name,p.Age);
}
}
}

定义Person类就不贴了,上面主要是在englishPerson对象上,上面指定eatFoodDelegate委托的函数是使用Lamdba实现的。可以看到左边是(Person p),右边是代码,中间是Lamdba运算符=>.用上面的与匿名方法的那个demo做比较发现这种方式更为简洁方便。不用再使用delegate关键字创建匿名方法了。

对于泛型委托,就放在泛型部分来了解吧。

C#语法之匿名函数和Lambda表达式的更多相关文章

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

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

  2. 3 委托、匿名函数、lambda表达式

    委托.匿名函数.lambda表达式 在 2.0 之前的 C# 版本中,声明委托的唯一方法是使用命名方法.C# 2.0 引入了匿名方法,而在 C# 3.0 及更高版本中,Lambda 表达式取代了匿名方 ...

  3. 匿名函数:Lambda表达式和匿名方法

    匿名函数一个"内联"语句或表达式,可在需要委托类型的任何地方使用.可以使用匿名函数来初始化命名委托,或传递命名委托(而不是命名委托类型)作为方法参数. 共有两种匿名函数: Lamb ...

  4. 测开之路八十二:匿名函数:lambda表达式

    # 匿名函数:lambda表达式# lambda 参数: 逻辑f = lambda name: print(name)f('tom') f2 = lambda x, y: x + yprint(f2( ...

  5. [C#学习教程-委托]001.大道至简之委托(代理),匿名函数,Lambda表达式

    引言:此文翻译自CodeProject上的同名文章<C# Delegates,Anonymous Methods, and Lambda Expressions>,在此一起Mark一下,此 ...

  6. 委托,匿名函数和lambda表达式

    很早之前就接触到了委托,但是一直对他用的不是太多,主要是本人是菜鸟,能写的比较高级的代码确实不多,但是最近在看MSDN微软的类库的时候,发现了微软的类库好多都用到了委托,于是决定好好的研究研究,加深一 ...

  7. C++的匿名函数(lambda表达式)

    总述  C++11提供了对匿名函数的支持,称为Lambda函数(也叫Lambda表达式). 它是定义和使用匿名函数对象的一种简便的方式.匿名函数是我们需要用到的一个函数,但是又不想去费力命名一个函数的 ...

  8. 匿名函数、lambda表达式

    匿名函数 func = lambda x: y #x是形参,y是返回值 键字lambda表示匿名函数,冒号前面的x表示函数参数,冒号后面的y表示匿名函数的返回值. 例1:返回列表中长度大于等于3的元素 ...

  9. 委托、匿名函数与Lambda表达式初步

    (以下内容主要来自<C#本质论第三版>第十二章委托和Lambda表达式) 一.委托续 上上周五看了看委托,初步明白了其是个什么,如何定义并调用.上周五准备看Lambda表达式,结果发现C# ...

随机推荐

  1. [JS] IE下ajax请求不生效或者请求结果不更新

    问题描述: IE8及以下版本里用jQuery发简单的GET时,第一次或者新开窗口后的请求没问题,可以正确返回结果.但是之后刷新页面或者触发某些操作得到的ajax请求结果永远和第一次一样. 问题分析: ...

  2. NPOI datatable导出类

    using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using System; using System.Collections.Generic; ...

  3. CSS3 & 页面布局

    相关链接 视频链接: CSS3 & 页面布局 CSS3与页面布局学习总结(一) CSS3与页面布局学习总结(二) CSS3与页面布局学习总结(三) CSS3与页面布局学习总结(四) CSS3与 ...

  4. 微信小程序开发教程(一)—介绍和准备

    前言: 因为客户需要,也为了更好的发展我们公司的产品,所以决定扩展移动端.但是由于公司没有原生安卓开发人员,而且开发安卓成本比较高,所以公司一致决定开发微信小程序,也是由于微信小程序最近的火热. 后台 ...

  5. Unity的Shader如何控制投影颜色

    细节慢慢补充,有几个需要注意的地方,必须要有接收投影的pass也就是Name是ShadowCollector的,必须添加#pragma multi_compile_fwdbase,物体的着色器必须有T ...

  6. 『原创』手把手教你搭建一个实用的油耗App(一)

    前言: 入行快10年,有点积蓄,三年前买了代步车.于是乎,汽车油耗开销就成了每个月都必须关注的问题.三年来,用过了无数油耗记录软件,比如最知名的“小熊油耗”,从第一次用,一直到最新一版,感觉越来越“臃 ...

  7. Educational Codeforces Round 34 (Rated for Div. 2) D - Almost Difference(高精度)

    D. Almost Difference Let's denote a function You are given an array a consisting of n integers. You ...

  8. MongoDB系统CentOS 7.1 crash的排障过程

    [作者] 王栋:携程技术保障中心数据库专家,对数据库疑难问题的排查和数据库自动化智能化运维工具的开发有强烈的兴趣. [问题描述] 最近我们有多台MongoDB的服务器CentOS 7.1系统发生了cr ...

  9. C# 后缀名

    用Visual Studio进行开发时项目内会有很多文件,其中常见的文件名后缀及其功能如下: .sln:解决方案文件,为解决方案资源管理器提供显示管理文件的图形接口所需的信息. .csproj:项目文 ...

  10. 【learning】微信跳一跳辅助c++详解 轻松上万 【下】

    如果你还没有看完本blog的上篇,建议您先看完上篇!! 第一代辅助如何死的? 我们先来看四张图      如上方最左图所示,前面是一个小圆柱子,看起来很人畜无害似不似?? 由于上一步跳出了偏差,并没有 ...