什么是委托委托是没有方法体的,声明委托就是一个关键字: 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. python!!!!惊了,这世上居然还有这么神奇的东西存在

    第一次接触到python的时候实在看学习3Blue1Brown的视频线性代数的本质的时候.惊奇的是里面的视频操作,例如向量的变化,线性变换等都是由python用代码打出来的.那时的我只是以为pytho ...

  2. Maven项目管理工具

    Maven项目管理工具 白面郎君 Svn eclipse maven量级 1 Maven的简介 1.1 什么是maven 是apache下的一个开源项目,是纯java开发,并且只是用来管理java项目 ...

  3. php 阿里云短信服务及阿里大鱼实现短信验证码的发送

    一:使用阿里云的短信服务 ① 申请短信签名 ②申请短信模板 ③创建Access Key,获取AccessKeyId 与 AccessKeySecret.(为了安全起见,这里建议使用子用户的Access ...

  4. CSS中的变形、过渡、动画效果

    一.变形 .过渡效果 1:元素平移 x方向 y方向 transform:translate(100px 100px); 2:过渡动画效果 a:什么属性参与过渡效果 b:过渡时间 c:过渡的效果 值包含 ...

  5. Python并发编程之线程消息通信机制任务协调(四)

    大家好,并发编程 进入第四篇. 本文目录 前言 Event事件 Condition Queue队列 总结 . 前言 前面我已经向大家介绍了,如何使用创建线程,启动线程.相信大家都会有这样一个想法,线程 ...

  6. Java Web之九九乘法表

    NineTabs.jsp 1 <%@ page language="java" import="java.util.*" contentType=&quo ...

  7. Unity文档阅读 第一章 入门

    Before you learn about dependency injection and Unity, you need to understand why you should use the ...

  8. Linux kernel的中断子系统之(八):softirq

    返回目录:<ARM-Linux中断系统>. 总结:中断分为上半部和下半部,上半部关中断:下半部开中断,处理可以延迟的事情.下半部有workqueue/softirq/tasklet三种方式 ...

  9. HQL: The Hibernate Query Language

    Chapter 14. HQL: The Hibernate Query Language 14.1. Case Sensitivity 14.2. The from clause 14.3. Ass ...

  10. tkinter中scale拖拉改变值控件(十一)

    scale拖拉改变值控件 使用户通过拖拽改变值 简单的实现: import tkinter wuya = tkinter.Tk() wuya.title("wuya") wuya. ...