委托与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 委托来 ...
随机推荐
- 用C++实现一个不能被继承的类
#include<iostream> using namespace std; class Gradpa { friend class Parent;//声明public或者private ...
- python爬虫入门(八)Scrapy框架之CrawlSpider类
CrawlSpider类 通过下面的命令可以快速创建 CrawlSpider模板 的代码: scrapy genspider -t crawl tencent tencent.com CrawSpid ...
- 洛谷 P1879 解题报告
P1879 [USACO06NOV]玉米田Corn Fields 题目描述 农场主\(John\)新买了一块长方形的新牧场,这块牧场被划分成\(M\)行\(N\)列\((1 ≤ M ≤ 12; 1 ≤ ...
- arcEngine开发之查看属性表
这篇文章给出实现属性表功能的具体步骤,之后再对这些步骤中的代码进行分析. 环境准备 拖动TOCControl.MapControl控件到Form窗体上,然后拖动ContextMenuStrip控件至T ...
- Webpack 热部署检测不到文件的变化
最近在用webpack开发,突然发现热部署检测不到文件的变化,相关webpack的代码并没有发生改变,而且同事们的webpack都是正常的,不能热部署严重影响我的开发效率. 网上查了一下原来 Webp ...
- TCP/IP Http 和Https socket之间的区别
TCP/IP Http 和Https socket之间的区别 TCP/IP是个协议组,它分为网络层,传输层和应用层, 在网络层有IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议. ...
- ubuntukylin18.04Lts和deepin15.5与win10 1803双系统安装
我首先安装的是ubuntu kylin(中文名优麒麟) 1.计算机右键选择管理磁盘,压缩卷设置空闲空间(第7步分区用) 2.重启时fn+f1进入bios设置界面. 3.关闭安全模式和快速启动,将boo ...
- JavaScript设计模式 Item 7 --策略模式Strategy
1.策略模式的定义 何为策略?比如我们要去某个地方旅游,可以根据具体的实际情况来选择出行的线路. 如果没有时间但是不在乎钱,可以选择坐飞机. 如果没有钱,可以选择坐大巴或者火车. 如果再穷一点,可以选 ...
- 最强AngularJS资源合集
AngularJS是Google开源的一款JavaScript MVC框架,弥补了HTML在构建应用方面的不足,其通过使用指令(directives)结构来扩展HTML词汇,使开发者可以使用HTML来 ...
- GitHub 系列之「向GitHub 提交代码」
1.SSH 你拥有了一个 GitHub 账号之后,就可以自由的 clone 或者下载其他项目,也可以创建自己的项目,但是你没法提交代码.仔细想想也知道,肯定不可能随意就能提交代码的,如果随意可以提交代 ...