初步理解委托、事件、匿名方法和Lambda

C#委托的使用方法 C# 委托的使用方法1 委托的定义2 什么时候使用委托3 委托有哪些形式?4 委托的语法,使用5 委托的使用流程 1 委托的定义 C# 中的委托(Delegate)类似于 C 或 C++ 中函数的 指针 。委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。委托(Delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 Sys... 阅读详情

最经在学习LinqtoSql,然后扯到Lambda表达式,然后扯到匿名方法,然后扯到委托,最后扯到事件处理。。。后来发现对委托这个概念和事件处理这个过程理解得不是很清晰,遂得一下学习笔记。那里说得不对,请大家多多指教!

第一部分:理解委托

委托委托,顾名思义,就是类似于中间人的意思,有些事情你不做,委托别人去做,比如你想相亲,但你不想去主动约女孩子,那你可以交给媒婆去帮你约。

如果你学过C++,请把委托理解成函数指针,都是为了调用函数。函数指针可以调用符合该函数指针要求的函数。什么叫符合该函数指针要求?就是被调用的函数拥有和该函数指针一样的返回类型、参数的个数相同、对应参数的类型一致。

函数指针举例说明。int (*p)(int,int);定义了一个函数指针p,p只能调用 函数原型(或者说函数签名)是 返回类型为int、只有两个参数并且参数类型都是int的函数。

委托举例说明:delegate void MyDelegate(int a,int b);声明了一种委托类型 MyDelegate(委托有不同类型,就好像中间人有不同类型,你想相亲就找媒婆这种中间人,你想看风水,就找风水大师这种中间人),这种委托类型只能调用 返回类型是void、只有两个参数并且参数类型都是int的函数。跟函数指针是不是很像?

委托其实就是一个类,委托的基类是Delegate 类,只不过我们不能显示地从 Delegate 类派生出委托类(Delegate 类不是委托类型,它的派生类才是),这是给系统和编译器用的。只不过类实例化之后就叫对象,而委托实例化之后还是叫委托而已,另外实例化委托必须提供一个相对应的函数作为参数。

 

举例说明定义委托:(参考自:http://www.cnblogs.com/warensoft/archive/2010/03/19/1689806.html)

1、定义一个函数Max,函数签名位:返回类型为int,两个参数,参数类型都是int

int Max(int x,int y)  {return x>y?x:y;}

2、创建一个委托类型(名字是MyDelegate),并声明该委托类型可以调用的函数的函数原型(函数签名)为:返回类型为int,两个参数,参数类型都是int。注意,委托是一个类,创建委托类型要放在函数外面

delegate int MyDelegate(int a,int b);

3.建立一个委托类的实例(或者说MyDelegate的实例),并指向要调用的方法,有两种方式:

 

//利用委托类的构造方法指定,这是最为常见的一种方式

MyDelegate md = new MyDelegate(Max);

 

//利用自动推断方式来指明要调用的方法,该形式更类型于函数指针

 

MyDelegate md = Max;

 

用第一种方式创建委托实例时必须提供一个函数签名符合该委托类型的函数作为参数。

4、利用委托类实例调用所指向的方法

int c = md(4,5);

 

总结:可以把委托理解成函数指针,可以调用函数签名和委托类型一致的函数

 

第二部分:事件处理(本文主要想表达对委托的理解,所以这部分以后再详说)

事件处理涉及到两个对象:一个是事件源(就是触发该事件的对象),另一个是事件接收者(提供了处理方法的类)。两者本无联系。

事件处理的过程:首先事件源触发了某事件,委托捕获到这件事(委托通过订阅该事件实现),委托调用事件接收类中的相应函数进行处理。

举例说明:this.button1.Click += new System.EventHandler(this.button1_Click);

事件源是button1,触发的事件是 按钮单击事件 Click,委托是 System.EventHandler ,事件处理函数是 button1_Click 。上面代码的意思是,System.EventHandler (委托)对 this.button1(事件源)的  Click (事件) 进行订阅,当this.button1 的Click事件发生时,委托接收事件源传过来的一些参数,接着调用 this.button1_Click (事件处理函数) 并把从事件源那里接收的参数传给该函数作为参数。

 

第三部分:匿名方法

匿名方法就是没有名字的方法(函数),既然没有名字,就是说只有在定义的时候能调用,在其他地方就不能调用了(没有名字啊,那就找不到嘛)。为什么要用到匿名方法呢?调用函数是需要花销的,但有时候调用的一些方法很短小(例如一句话方法)、只完成很少的功能,这个时候就有点得不偿失了,此时就可以定义一个匿名方法来完成这个功能了,而匿名方法作为内联代码,花销相对小很多。匿名方法都是和委托连在一起用的(以后还有lambda表达式),以前创建委托实例时需要传递一个函数名给它作为参数,现在可以通过匿名方法直接把一段代码传进去了

定义匿名方法:用到delegate关键字,如:delegate(int a, int b){return a > b ? a : b ;}   代码定义了一个匿名方法,该方法的参数是 int a 和 int b ,方法体是 {return a > b ? a : b}。如果只是定义一个匿名方法没有意义,因为定义完过后你就再也不能用这个匿名方法,所以匿名方法要在定义的时候就马上使用。一般来说就是初始化委托了。

使用匿名方法:

View Code
复制代码
 1 namespace DelegateTest
 2 {
 3     class Program
 4     {
 5         //创建委托类型
 6         delegate int Mydelegate(int x, int y);
 7         static void Main(string[] args)
 8         {
 9           //创建委托实例,指向匿名函数
10           Mydelegate mydelegate = delegate(int x,int y) { return x + y; };
11 
12           //通过委托调用匿名方法
13           Console.WriteLine(mydelegate(3,2));
14 
15           Console.ReadKey();
16         }
17     }
18 }
复制代码

 

 总结:匿名方法就是没有名字的方法,只能通过委托来被调用(这句话可能有误,匿名方法也可以直接订阅事件作为事件处理函数,当事件发生时就接收相应参数并执行函数体)。

 

第四部分:Lambda

上面说到可以通过匿名方法以内联代码的方式来简介地实现委托,但还有更简洁的方法,那就是用lambda表达式来代替匿名方法,在这里,lambda表达式就是匿名方法的简洁版。

Lambda表达式的语法如下:

(param1, param2 ...,paramN) =>

{

表达式1;

表达式2;

return 返回值;

}

param1, param2 ...,paramN 就是参数,不用确定类型,编译器会做这个工作,花括号了就是lambda表达式要执行的语句,如果对应的委托类型有返回值,那么就要有return 语句。

把第三部分那个匿名方法的例子改成用lambda表达式实现:

复制代码
 1 namespace DelegateTest
 2 {
 3     class Program
 4     {
 5         //创建委托类型
 6         delegate int Mydelegate(int x, int y);
 7         static void Main(string[] args)
 8         {
 9           //创建委托实例,指向匿名函数
10 //      Mydelegate mydelegate = delegate(int x,int y) { return x + y; };
11 
12 //通过委托调用匿名方法
13 //    Console.WriteLine(mydelegate(3,2));
14 
15           Mydelegate youdelegate = (x, y) => { return (x - y); };
16           Console.WriteLine(youdelegate(3, 2));
17 
18           Console.ReadKey();
19         }
20     }
21 }
复制代码

 

总结:匿名方法就是没有名字的函数,Lambda表达式就是匿名方法的简洁版(指的是用在委托上这方面,Lambda还有其他方面的用处),两者都只是让代码更简洁,但在更底层层次本质是一样的

深入理解 C# 的委托、事件与 Lambda 表达式 委托(Delegate)是 C# 中的一种类型安全的函数指针,可以存储和调用方法。它的本质是一个类,用于封装方法。定义一个委托类似于定义一个方法。定义委托实例化委托调用委托");事件(Event)是基于委托的一种高级封装,用于实现发布-订阅模式。事件只能在声明它的类中触发,外部类只能订阅或取消订阅。定义事件触发事件// 业务逻辑.Invoke();订阅事件");Lambda 表达式是一种简洁的匿名方法表示方式,使用=>语法将输入参数与表达式或代码块分隔。 阅读详情

相关推荐

C# 委托、事件与 Lambda 表达式,全面讲解

委托是 C# 中的一个类型,它封装了一个方法的引用。通过委托,可以在运行时调用与其相关联的方法,而不需要事先知道该方法的确切实现。委托是一种类型安全的函数指针,它能够确保参数类型和返回类型的正确性。事件是 C# 中的一种特殊的委托,用于实现事件驱动编程。事件提供了一种机制,允许对象通知外部代码某些事情已经发生。事件通常与委托一起使用,委托定义了事件的处理方法签名,而事件则用于触发这些处理方法。事件通常由event// 声明一个委托类型事件// 触发事件MyEvent?

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 928

c#:匿名委托

匿名委托原型: delegate { xxx }

默铭 3886

C#中的委托机制:深入理解与应用

委托的定义类似于方法的签名,它指定了方法的返回类型和参数类型。public delegate 返回类型 委托名称(参数类型1 参数名称1, 参数类型2 参数名称2, ...);首先,我们需要定义一个委托类型。public delegate 返回类型 委托名称(参数类型1 参数名称1, 参数类型2 参数名称2, ...);在这个例子中,add委托实例指向Add方法,并通过调用委托来执行加法操作。委托是C#语言中一个重要而强大的特性,它为开发者提供了一种灵活且类型安全的方式来处理方法调用。

不迁怒,不贰过。小知识,大智慧。 1568

匿名委托。

在 C# 语言中匿名委托是指使用匿名方法注册在委托上,实际上是在委托中通过定义代码块 来实现委托的作用。 具体的语法形式如下: 通过上面 3 个步骤即可完成匿名委托的定义和调用,需要注意的是,在定义匿名委托时代 码块结束后要在 {} 后加上分号。 举例如下: 泛型集合中使用匿名委托:...

weixin_57762627的博客 238

Action<T>和Func<T>泛型委托,委托,泛型,匿名函数,Lambda表达式的综合使用

前言 在上篇文章C#中委托(delegate)和多播委托的理解中已经基本了解了委托的用法。 由于委托封装的方法我们不一定知道其传入的参数和返回值,例如之前说的的排序方法—————在对象的排序算法中,需要对对象进行比较,而不同对象比较的方法不同,所以比较两个对象的方法的引用可以作为参数传递到排序算法中,这个时候就需要传递方法。 当我们要生成一个封装比较对象的方法的委托时,我们并不知道该方法传入对象是...

define_LIN的博客 1304

手把手教你用三菱PLC控制JET伺服原点:从硬件接线到GXWORKS3程序调试

本文详细介绍了如何使用三菱PLC控制JET伺服系统实现原点回归功能,涵盖硬件接线、参数配置到GX Works3程序调试的全流程。通过实战指南,帮助工程师快速掌握伺服控制技术,提升工业自动化项目的实施效率。

weixin_30642561的博客 536

C#匿名委托

在 C# 语言中匿名委托是指使用匿名方法注册在委托上,实际上是在委托中通过定义代码块来实现委 托的作用,具体的语法形式如下。 1 //1. 定义委托 2 修饰符 delegate返回值类型 委托名( 参数列表 ); 1 //2. 定义匿名委托 2 委托名 委托对象 = delegate 3 { 4//代码块 5 }; 1 //3. 调用匿名委托 2 委托对象名 ( 参数列表 ); 通过上面 3 个步骤即可完成匿名委托的定义和调用,需要注意的是,在定义匿名委托...

New_BoKe的博客 3055

电路仿真软件PSIM简介

PSIM的基本使用操作...

qq_55203246的博客 7186

匿名委托Func—Action; 朗姆达表达式

匿名委托,也称作匿名方法namespace ConsoleTest { public delegate void Mydeleage(int x, int y);//定义了一个委托 class Program { static void Main(string[] args) { //这里定义了一个匿名委托:deleg...

Fanbin168的专栏 4190

LiveGBS流媒体平台GB/T28181实战指南:海康NVR物联网卡摄像头注册失败全链路排查与抓包技巧

本文详细解析了LiveGBS流媒体平台中海康NVR物联网卡摄像头注册失败的常见问题及解决方案。通过全链路排查与抓包技巧,包括物联网卡配置、多网卡冲突处理、防火墙设置等,帮助用户快速定位并解决GB/T28181协议下的设备注册难题,提升流媒体平台部署效率。

weixin_29290947的博客 495

多核异构处理器核间通信:从共享内存到RPMsg协议的实战解析

在多核异构处理器架构中,核间通信是实现高效协同计算的核心技术。其基本原理是通过共享内存作为数据交换的物理媒介,配合硬件信号机制实现同步与通知。从技术价值看,它解决了不同架构核心间的数据共享与指令协同问题,是释放异构计算潜力的关键。在应用场景上,该技术广泛应用于智能物联网设备、汽车电子和工业控制等领域,用于连接高性能应用处理器与实时微控制器。本文以典型的ARM Cortex-A与Cortex-M组合为例,深入剖析了基于共享内存和RPMsg协议的通信机制,涵盖了从硬件基础到软件协议栈的完整实现链路,并提供了针对

weixin_26969269的博客 450

C#学习之初步理解委托、事件、匿名方法和Lambda

  最经在学习LinqtoSql,然后扯到Lambda表达式,然后扯到匿名方法,然后扯到委托,最后扯到事件处理。。。后来发现对委托这个概念和事件处理这个过程理解得不是很清晰,遂得一下学习笔记。那里说得不对,请大家多多指教! 第一部分:理解委托 委托委托,顾名思义,就是类似于中间人的意思,有些事情你不做,委托别人去做,比如你想相亲,但你不想去主动约女孩子,那你可以交给媒婆去帮你约。 如果你学...

weixin_34329187的博客 250

从养殖场到科技前沿:YOLOv11+OpenCV精准计数鸡蛋与鸡

YOLOv11结合OpenCV技术,精准识别和计数鸡蛋与鸡,广泛应用于养殖场、市场监控和自动化包装。通过深度学习与计算机视觉,提升农业生产效率,让智能化管理更简单高效。

专注于深入研究多种编程语言,以实战为导向,逐步拓展开发技能,提升工程化编码和思维能力,展现无敌技术实力。 1208

Unity委托事件delegate、匿名方法、Lambda基础语法

我们可以这样理解委托:委托可以把“方法”当做“参数”来传递。往下再看会儿就知道了。 常见的类型有string,int,float,这些都是类型,那“方法”就是委托类型。 委托的语法: using System.Collections; using System.Collections.Generic; using UnityEngine; ////访问修饰符 delegate 返回值类型 委托名称(参数列表); public delegate void ShowDelegate();

weixin_55532142的博客 2397

从 VS Code 创建 ABAP Development Objects,包、命名、传输请求和 Clean Core 的一条线打通

文章摘要: SAP ABAP开发工具正从传统SAP GUI/Eclipse向VS Code迁移,通过ABAP Development Tools扩展实现代码编辑、调试和传输管理。文章重点分析了创建ABAP对象背后的治理逻辑:1)对象创建涉及包结构、命名规范、传输层等关键设计决策;2)VS Code通过命令面板(Ctrl+Shift+P)提供统一创建入口;3)对象类型选择反映架构意图,应从业务模型角度规划;4)Package是重要的治理边界,需按业务能力分区;5)命名和描述需体现业务语义;6)传输请求标记对象

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 178

【ComfyUI】SDXL + 单LoRA 房屋平面图渲染装修

本文介绍了一种基于ComfyUI的室内平面设计图自动生成效果图的工作流。该流程通过导入房屋平面图,结合SDXL室内设计模型与北欧风格LoRA模块,快速生成多房间效果展示。工作流包含图像输入、文本处理、模型加载和图像生成等环节,支持风格化渲染和细节补充,适用于建筑设计、家装展示、房地产营销等场景。核心采用SDXL通用室内设计模型和北欧极简LoRA,通过节点衔接实现自动化批量生成,能在短时间内将平面方案转化为逼真的三维效果图。该技术可提升设计呈现效率,辅助客户决策,并应用于教学研究领域。

Mr数据杨 3664

C#委托和事件

/访问修饰符默认不写 为public 在别的命名空间中也能使用//private 在别的命名空间不能使用//申明一个用来存储无参无返回值函数的容器//这里只定义规则,并没有使用//委托规则的申明 不能重名(同一语句块中)//不能重载!//申明一个用来存储返回值为int 有一个int参数的函数的容器//委托变量是函数的容器//委托常用在:1.作为类的成员 2.作为函数的参数class Test//先处理一些别的逻辑,当这些逻辑处理完了,再执行传入的函数int i = 1;

m0_61939767的博客 1708

数学建模学习(75):全局敏感性分析Morris 方法

敏感性分析 (SA) 是分析不同应用条件下模型行为的基本实践。提出了许多 SA 技术,从简单的筛选方法到计算成本高昂的基于方差的方法。本篇内容我们通过将 Morris 方法来对模型进行分析。

全栈川川 1万+

委托、事件与匿名方法

Delegates, Events, and Anonymous Methods 委托、事件与匿名方法 译者注:委托、事件和匿名方法等在C#编程中有广泛运用,也有很多资料和书籍对它们做过大量介绍,但在我接触的人群中仍有很多人对它们还不甚了解,甚至惧怕。我希望这篇博文能够把这些东西说清讲透,也希望有此需要的园友在阅读之后能够获得对它们的深刻理解,并在今后的编程生涯中熟练地运用它们。还希望

IT成功之路开始 1238

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

聊聊C#委托,匿名方法,Lambda,泛型委托,表达式树

原本很简单的程序,加上几个delegate关键字,这代码一下就变得深奥了,深奥的东西懂的人就变少了,所以这个还可以作为加薪的筹码。委托是通过delegate关键字来定义,简单来说,委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。不管是匿名方法还是Lambda表达式,完成一个委托的应用,都逃不过两个步骤,一步是定义一个委托,另一步是用一个方法来实例化一个委托。有些教材,博客说到委托都会提到事件,虽然事件是委托的一个实例,但是为了理解起来更简单,今天只谈委托不谈事件。

qq_41942413的博客 1124

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C# 深入理解委托、匿名方法和 Lambda 表达式

https://zhuanlan.zhihu.com/p/101178999

漫漫无期的博客 655

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【愚公系列】2023年02月 .NET/C#知识点-委托、匿名方法、Lambda、泛型委托、表达式树的进化史

在 .NET 中,委托是一种类型,它可以持有对一个或多个方法的引用,并允许将这些方法作为参数传递给其他方法。.NET 中的委托类似于 C 和 C++ 中的函数指针,但具有更高的类型安全性和其他功能。委托的概念最早可以追溯到早期的编程语言,例如Simula和Smalltalk。然而,C# 的委托实现受到了函数指针和C++中的函数对象的启发。在.NET框架中,委托最初被引入为事件处理程序的机制。事件是一种广泛使用的编程模型,用于在程序中处理异步和交互性操作。事件可以被认为是类似于信号和槽机制的一种形式。

愚公智库 8795

C# 委托、匿名委托、Lambda表达式详解

文章目录委托委托概述声明委托类型创建委托对象给委托赋值组合委托为委托添加方法从委托移除方法调用委托委托的示例调用带有返回值的委托调用带有引用参数的委托匿名方法使用匿名方法匿名方法的语法变量和参数的作用域Lambda表达式 委托 ​ 可以认为委托是持有一个或多个方法的对象。当然,正常情况下你不会想要“执行”一个对象,但委托与典型的兑现不同。可以执行委托,这是委托会执行它所“持有”的方法。 ​ 如果你有C++背景,理解委托最快的方法就是把它看成一个类型安全的、面向对象的C++函数指针。 ​ 我们将从下面的示例代

断点_C的博客 1079

C#委托之如何理解委托面试常见题:

委托(delegate)是一种存储函数引用的类型。这听起来相当深奥,但其机制是非常简单的。委托的声明非常类似于函数,但不带函数体,且要使用delegate 关键字。委托的声明制定了一个返回类型和一个参数列表。 定义了委托后,就可以声明该委托类型的变量。接着把这个变量初始化为与委托具有相同返回类型和参数列表的函数引用。之后,就可以使用委托变量调用这个函数,就像该变量是一个函数一样。 有了引用函数的变...

qq_41231360的博客 3204

C# 基础巩固 详解 匿名方法、lambda表达式和Action关键字

C# 基础巩固 详解 匿名方法、lambda表达式和Action关键字

毫无遗憾的帅哥 1508

C#基础--委托、lambda表达式和事件

Actioni3用带一个参数的方法,Action调用带两个参数的方法,Action调用带8个参数的方法。Func委托类型可以调用带 返回类型且无参数的方法,Func调用带一个参数的方法,Func调用带4个参数的方法。匿名方法是用作委托的参数的一段代码。

不求上进的码农的博客 3374
上一篇: 构造器的那点事
下一篇: string与double的互相转换
拿铁加不加糖
博客等级 码龄16年 75粉丝 27原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值