什么是委托委托是没有方法体的,声明委托就是一个关键字: 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关系的更多相关文章

  1. 委托学习过程及委托、Lambda表达式和匿名方法的关系总结及事件总结

    第一章,当开始学习委托的时候,我们会问什么是委托?为什么要学习委托? 一,什么是委托? 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法, ...

  2. 委托、匿名委托、Lambda 表达式、Expression表达式树之刨根问底

    本篇不是对标题所述之概念的入门文章,重点在阐述它们的异同点和应用场景.各位看官,这里就不啰嗦了,直接上代码. 首先定义一个泛型委托类型,如下: public delegate T Function&l ...

  3. C# Note2:委托(delegate) & Lambda表达式 & 事件(event)

    前言 本文主要讲述委托和Lambda表达式的基础知识,以及如何通过Lambda表达式实现委托调用,并阐述.NET如何将委托用作实现事件的方式. 参考:C#高级编程 1.什么是委托(delegate)? ...

  4. 深入学习C#匿名函数、委托、Lambda表达式、表达式树类型——Expression tree types

    匿名函数 匿名函数(Anonymous Function)是表示“内联”方法定义的表达式.匿名函数本身及其内部没有值或者类型,但是可以转换为兼容的委托或者表达式树类型(了解详情).匿名函数转换的计算取 ...

  5. C#从委托、lambda表达式到linq总结

    前言 本文总结学习C#必须知道的基础知识,委托.监视者模式.常用lambda表达式.linq查询,自定义扩展方法,他们之间有什么关系呢?匿名委托是如何演变成lambda表达式,lambda再如何导出l ...

  6. C#高级编程(第9版) 第08章 委托、lambda表达式和事件 笔记

          本章代码分为以下几个主要的示例文件: 1. 简单委托 2. 冒泡排序 3. lambda表达式 4. 事件示例 5. 弱事件     引用方法 委托是寻址方法的.NET版本.在C++中函数 ...

  7. 使用匿名委托,Lambda简化多线程代码

    使用匿名委托,Lambda简化多线程代码   .net中的线程也接触不少了.在多线程中最常见的应用莫过于有一个耗时的操作需要放到线程中去操作,而在这个线程中我们需要更新UI,这个时候就要创建一个委托了 ...

  8. 转载 C#匿名函数 委托和Lambda表达式

    转载原出处: http://blog.csdn.net/honantic/article/details/46331875 匿名函数 匿名函数(Anonymous Function)是表示“内联”方法 ...

  9. 十二、C# 委托与Lambda表达式(匿名方法的另一种写法)

    委托与Lambda表达式   1.委托概述 2.匿名方法 3.语句Lambda 4.表达式Lambda 5.表达式树   一.委托概述 相当于C++当中的方法指针,在C#中使用delegate 委托来 ...

随机推荐

  1. Visual Studio 201~ Code 格式检查

    前言 好的代码格式,有利于阅读和查错,慢慢的有利于养成良好的编码习惯,也可以帮我们找出一些低级错误. StyleCop 在Nuget上搜索stylecop,选择MSBuild的那个版本,安装. 手动编 ...

  2. SSM-Spring-14:Spring中默认自动代理DefaultAdvisorAutoProxyCreator

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 默认自动代理DefaultAdvisorAutoProxyCreator 本处没有什么要讲的,放原代码 ISo ...

  3. 可能是迄今为止最好的GitHub代码浏览插件--赞

    https://chrome.google.com/webstore/category/extensions?hl=zh-CN 搜索"insight.io" chrome://ex ...

  4. 你不知道的JavaScript--Item10 闭包(closure)

    JavaScript 闭包究竟是什么? 用JavaScript一年多了,闭包总是让人二丈和尚摸不着头脑.陆陆续续接触了一些闭包的知识,也犯过几次因为不理解闭包导致的错误,一年多了资料也看了一些,但还是 ...

  5. 19.最省钱的app发短信方法

    在创业团队中,一个重要的原则是能省就省,该花就花,把银子用在刀刃上. 现在的app,为了获取用户的社交关系,需要用户的手机号注册.用手机号注册就涉及到一个发送短信验证码的问题,那怎么才能在短信服务上投 ...

  6. Python爬取谷歌街景图片

    最近有个需求是要爬取街景图片,国内厂商百度高德和腾讯地图都没有开放接口,查询资料得知谷歌地图开放街景api 谷歌捷径申请key地址:https://developers.google.com/maps ...

  7. CSS技术实例1-使用CSS计数器实现数值计算小游戏实例页面

    一 实例要达到的要求如图所示: 二 分析 1.7个圆角矩形标签(或按钮) 2. 点击触发并开始运算,最后一个标签显示结果 3.计算成功后弹出"万岁"字眼 三 代码实现 关键CSS代 ...

  8. 开机出现loading Operating System的解决方案

    今天清理机箱之后开机发现电脑屏幕出现以下界面,提示的内容是"正在加载操作系统,磁盘启动失败,请插入系统盘..",出现这种状况的原因有以下几种: 1.主引导的扇区的损坏或者信息的错乱 ...

  9. diskqueue.go

    }

  10. b2OJ_1565_[NOI2009]植物大战僵尸_拓扑排序+最大权闭合子图

    b2OJ_1565_[NOI2009]植物大战僵尸_拓扑排序+最大权闭合子 题意:n*m个植物,每个植物有分数(可正可负),和能保护植物的位置.只能从右往左吃,并且不能吃正被保护着的,可以一个不吃,求 ...