委托与lambda关系
什么是委托委托是没有方法体的,声明委托就是一个关键字: delegate ,委托可以试有参无参,有返回值无返回值。和我们的方法是一样的。不同的区别是 委托没有方法体的,委托可放在类下也可以放在类的外面和类同等级。委托可以说是一个类型。
委托的声明:
//声明委托:
public delegate int Parameter(int Para);
public delegate void NoParameter();
public class Commondelegate
{
//声明委托:
public delegate int Parameter(int Para);
public delegate void NoParameter();
}
委托的实例化:
我们可以把委托看作一个帮工每个帮工都有各自的特长,这个帮工当你不告诉他要做什么的时候,他就不知道要做点什么,但是你使用他了,你就必须要指定他去做什么。不指定他去做什么然你就白花钱了,因为没有出活,帮工白请了。放到程序里就是报错了。委托是一个类也可以被实例化,他在实例化的时候需要给定参数。这个参数就是对应的方法。
//委托实例化
NoParameter noParameter = new NoParameter(Program.NoParameter);
Parameter parameter = new Parameter(Program.Parameter); /// <summary>
/// 无参无返回值方法
/// </summary>
public static void NoParameter()
{
}
/// <summary>
/// 有参有返回值方法
/// </summary>
/// <param name="Para"></param>
/// <returns></returns>
public static int Parameter(int Para)
{
return Para;
}
上面的代码中:我们可以看到,委托的实例化目的就是为了调用某一个方法。但是我们这样写的话,每使用一个相同的方法(注:参数相同,返回值相同,方法名不同的方法,也就是声明委托时委托的类型)都需要去事先创建这样的一个方法。这样会又很多冗余的代码出现。
我们换一种方法来实现上面的代码:
//委托实例化去执行方法:
NoParameter noParameterNew = new NoParameter(
delegate ()
{
Console.WriteLine("我是:无参无返回值方法");
}
);
Parameter parameterNew = new Parameter(
delegate (int Para)
{
Console.WriteLine("我是:有参有返回值方法");
return Para;
}
);
上面的代码实现了同样的结果:这其实就是委托了一个匿名方法去实现了功能。但是这种写法很多老前辈在工作的时候会写过,因为这可能是在Net 1.0/2.0的时候版本升级前的写法,后来出现了lambda 表达式,代码是这样写的。
//使用lambda 表达式
NoParameter noParameterNew1 = new NoParameter(
() =>
{
Console.WriteLine("我是:无参无返回值方法");
}
); Parameter parameterNew1 = new Parameter(
(int Para) =>
{
Console.WriteLine("我是:有参有返回值方法");
return Para;
}
);
上面的代码中使用 => // gose to 代替了delegate 这个时候我们看到 => 的时候就很熟悉了lambda 是我们经常会使用的. 其实lambda 更是一个匿名方法。我们还可以进化一下,当方法体只有一行的时候可以这样写。
我们再换一种实现方式:
//使用lambda 表达式
NoParameter noParameterNew1 = new NoParameter(
() => Console.WriteLine("我是:无参无返回值方法")
); Parameter parameterNew1 = new Parameter(
(Para) => Para
);
上面的代码 中执行有参数的时候我们可以看到我们的参数并没有去声明参数类型,委托会自动帮我们去推算了。
其实我们还可以去这样写。
//使用lambda 表达式
NoParameter noParameterNew1 =() => Console.WriteLine("我是:无参无返回值方法");
Parameter parameterNew1 = (Para) => Para;
Parameter parameterNew2 = Para => Para;
上面的代码我们在看的时候,就越来越熟悉了,第一眼看过去你就会以为是lambda吧,其实=号后面的代码是lambda,前面的还是委托的实例。其实我们大多数情况下是可以不用去声明委托的,系统已经给我们准备好了两个方法供我们使用:
Action; 无返回值委托最多可接收参数 16 个
Func; 有返回值委托,最多可接收参数16个 外加一个返回值参数。
https://docs.microsoft.com/en-us/dotnet/api/system.action?redirectedfrom=MSDN&view=netframework-4.7.2 官方的连接有详细的介绍。
上面的代码很简单,没有去深入的去说一些东西。
有不足之处 希望大家指出相互学习,
本文原创:转载请注明出处 谢谢!
委托与lambda关系的更多相关文章
- 委托学习过程及委托、Lambda表达式和匿名方法的关系总结及事件总结
第一章,当开始学习委托的时候,我们会问什么是委托?为什么要学习委托? 一,什么是委托? 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法, ...
- 委托、匿名委托、Lambda 表达式、Expression表达式树之刨根问底
本篇不是对标题所述之概念的入门文章,重点在阐述它们的异同点和应用场景.各位看官,这里就不啰嗦了,直接上代码. 首先定义一个泛型委托类型,如下: public delegate T Function&l ...
- C# Note2:委托(delegate) & Lambda表达式 & 事件(event)
前言 本文主要讲述委托和Lambda表达式的基础知识,以及如何通过Lambda表达式实现委托调用,并阐述.NET如何将委托用作实现事件的方式. 参考:C#高级编程 1.什么是委托(delegate)? ...
- 深入学习C#匿名函数、委托、Lambda表达式、表达式树类型——Expression tree types
匿名函数 匿名函数(Anonymous Function)是表示“内联”方法定义的表达式.匿名函数本身及其内部没有值或者类型,但是可以转换为兼容的委托或者表达式树类型(了解详情).匿名函数转换的计算取 ...
- C#从委托、lambda表达式到linq总结
前言 本文总结学习C#必须知道的基础知识,委托.监视者模式.常用lambda表达式.linq查询,自定义扩展方法,他们之间有什么关系呢?匿名委托是如何演变成lambda表达式,lambda再如何导出l ...
- C#高级编程(第9版) 第08章 委托、lambda表达式和事件 笔记
本章代码分为以下几个主要的示例文件: 1. 简单委托 2. 冒泡排序 3. lambda表达式 4. 事件示例 5. 弱事件 引用方法 委托是寻址方法的.NET版本.在C++中函数 ...
- 使用匿名委托,Lambda简化多线程代码
使用匿名委托,Lambda简化多线程代码 .net中的线程也接触不少了.在多线程中最常见的应用莫过于有一个耗时的操作需要放到线程中去操作,而在这个线程中我们需要更新UI,这个时候就要创建一个委托了 ...
- 转载 C#匿名函数 委托和Lambda表达式
转载原出处: http://blog.csdn.net/honantic/article/details/46331875 匿名函数 匿名函数(Anonymous Function)是表示“内联”方法 ...
- 十二、C# 委托与Lambda表达式(匿名方法的另一种写法)
委托与Lambda表达式 1.委托概述 2.匿名方法 3.语句Lambda 4.表达式Lambda 5.表达式树 一.委托概述 相当于C++当中的方法指针,在C#中使用delegate 委托来 ...
随机推荐
- Myeclipse+selenium2.0+Junit+TestNg环境搭建
这周末把自动化的环境搭好了,在网上也百度了很多,现在分享下,希望大家少走一点歪路. 需要用到的安装包都在这个里面,自取: 链接:https://pan.baidu.com/s/10ohf757ztgN ...
- 基于Microsoft Graph打造自己的Timeline应用
原文链接:https://github.com/chenxizhang/office365dev/blob/e9b5a59cb827841d36692cc4ec52c11d43062e04/docs/ ...
- .NET开发微信小程序-Template模块开发
1.添加一个文件目录,里面放模板信息 例:我在根目录添加一个文件夹:template 然后在这个文件夹下面添加相应的页面.比如我添加一个promodel.wxml文件.主要是放商品相关的模块信息(注: ...
- Spring+Mybatis多数据源的一种实现方式,支持事务
最近一个项目用到了多个数据库,所以需要实现动态切换数据源来查询数据,http://www.cnblogs.com/lzrabbit/p/3750803.html这篇文章让我受益匪浅,提供了一种自动切换 ...
- 海量信息库,查找是否存在(bloom filter布隆过滤器)
Bloom Filter(布隆过滤器) 布隆过滤器用于测试某一元素是否存在于给定的集合中,是一种空间利用率很高的随机数据结构(probabilistic data structure),存在一定的误识 ...
- linux下Clang和gcc的区别
Clang 比 GCC 编译器的优势: 编译速度更快 编译产出更小 出错提示更友 好,比如 clang 在编译过程可以直接指出相对简单的出错位置以及它 “ 认为 ” 正确的方式 . 内置有静态分析工具 ...
- Struts2中数据封装方式
一.通过ActionContext类获取 public class ActionContextDemo extends ActionSupport { @Override public S ...
- Kali Linux图形界面与命令行界面的切换
前言: 有时候为了节约系统资源,使用命令行界面能够让Linux系统的运行更加流畅,处理任务的速度也更加快.现在的Kali安装完成后默认是开机就启动图形化界面.本文将介绍通过编辑Kali启动引导文件的方 ...
- Servlet到底是单例还是多例你了解吗?
为一个Java Web开发者,你一定了解和学习过Servlet.或许还曾在面试中被问到过Servelt是单例还是多例这个问题. 遇到这个问题,你是否曾深入了解过,还是百度或者Google了一下,得到答 ...
- 关于python中phantomjs无法访问网页的处理
笔者使用的系统是linux ubuntu,最近在学习爬虫的过程中遇到了一个抓狂的问题,我尝试使用selenium加phantomjs来登陆网页的时候,Pythony一直提示selenium无法找到元素 ...