什么是委托委托是没有方法体的,声明委托就是一个关键字: 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. Mego(05) - Mego for Visual Studio Extension

    前言 可能对于一个新的框架而言使用入门对于陌生人而言是比较困难的,因此为了最大限度的为使用者提供便利性,我们给Mego框架开发了针对Visual Studio的集成开发工具,让大家可以像使用Entit ...

  2. sqlilabs 5

    第一个1不断返回true,2可以进行更改?id=-1' union select 1,2,3 and '1?id=-1' union select 1,2,3 and 1='1 ?id=-1' uni ...

  3. SSM-SpringMVC-23:SpringMVC中初探异常解析器

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客要讲的是异常解析器,SimpleMappingExceptionResolver简单映射异常解析器 可 ...

  4. Java公开课-04.异常

    一,异常的概念 程序在运行时,发生了我们没有预测的结果,它阻止了程序按照我们预期效果执行 二,怎么保证我们的程序在发生异常以后 ,代码继续执行? 异常处理机制 在程序发生异常以后,还能按照我们事先设定 ...

  5. VirtualBox报错:不能为虚拟电脑XXX打开一个新任务

    报错产生的背景 今天在这里下载了一个用于VirtualBox的Kali Linux虚拟机文件(使用VirtualBox可以直接打开使用,不用执行安装过程).但是将该文件导入到VirtualBox中之后 ...

  6. tkiner中Radiobutton单选框控件(七)

    Radiobutton控件 由于本次内容中好多知识都是之前重复解释过的,本次就不做解释了.不太清楚的内容请参考tkinter1-6节中的内容 import tkinter wuya = tkinter ...

  7. spring(一)--spring/springmvc/spring+hibernate(mybatis)配置文件

    这篇文章用来总结一下spring,springmvc,spring+mybatis,spring+hibernate的配置文件 1.web.xml 要使用spring,必须在web.xml中定义分发器 ...

  8. CentOS6.*安装gitolite

    http://www.kankanews.com/ICkengine/archives/64748.shtml 2人收藏此文章, 发表于4小时前(2013-10-22 16:12) , 已有26次阅读 ...

  9. 整合 ucenter 注册自动激活

    http://my.oschina.net/banbo/blog/311691 应用整合 UCenter,同步注册到 Discuz 的用户,在 Discuz 登录时得手动激活,用户体验很不好,不过解决 ...

  10. driver匹配元素定位用法大全

    # -*- coding:utf-8 -*- from selenium import webdriver from selenium.webdriver.common.by import By fr ...