C#中的委托与事件笔记——基础

(目录)微气候模型ENVI-met模拟的基本使用教程 ENVI-met模拟操作系列(一) 介绍: 阅读详情
一、委托
  1. 委托的作用

    • 作为函数传参:包括回调函数(如 MyHeavyJob 方法执行完成后调用回调函数通知调用者)和在 LINQ 中传递规则(如 Select 方法对数组元素进行定制操作、PickOne 方法根据规则从两个数中选一个、Where 方法根据规则筛选元素)。

    • 声明事件:基于委托声明事件,如按钮的点击事件。

  2. 委托的声明与使用

    • 声明:在函数声明前加 delegate 关键字,类似接口中声明函数(只声明不实现)。

    • 实例化:实例化委托时需传递一个与委托函数签名相同的函数。

    • 调用:可将委托当作函数直接调用(如 fo())或使用 Invoke 方法调用。

    • 注册与删除方法:可以注册多个方法,注册顺序会影响调用顺序;也可以删除已注册的方法。

    • 判断是否为空:可通过判断委托是否等于 null 来确定其是否指向任何函数。

    委托本质上是一种引用类型,可以实例化一个委托,实例化时需要传入一个与委托签名匹配的函数,之后即可调用该委托

    delegate void Foo();
    void MyFunc()
    {
        Console.WriteLine("hello");
    }
    var foo = new Foo(MyFunc);
    // 虽然委托实例化时需要传入一个函数,但委托依然可以为空,如:
    // foo -= MyFunc; // 删除 MyFunc 方法,此时foo即为一个空的委托,调用时会报错 NullReferenceException
    // 一个委托可以注册多个方法,调用时会依次调用注册的函数
    // foo += MyFunc; // 此时foo中已经注册了两次 MyFunc 方法,调用时会输出两次hello
    foo(); // 调用委托
    // fooo.Invoke(); // 也可以使用 Invoke 方法调用
    

    带有返回值的委托在调用时只会返回最后注册的函数的返回值

  3. 经典使用案例

    1. 回调函数
    delegate void Callback();
    
    void MyHeavyJob(Callback callback)
    {
        Thread.Sleep(1500);
        callback();
    }
    
    void MyCallback()
    {
        Console.WriteLine("Job done");
    }
    
    MyHeavyJob(MyCallback);
    

    运行后1.5s后输出 “Job done”

    1. 策略模式,通过委托将“决策逻辑”(判断规则)作为参数传递
    delegate bool MyRule(int x, int y);
    
    int PickOne(int a, int b, MyRule rule)
    {
        if (rule(a, b)) return a;
        else return b;
    }
    
    bool MySpecialRule1(int x, int y)
    {
        return true;
    }
    
    bool MySpecialRule2(int x, int y)
    {
        return false;
    }
    
    Console.WriteLine(PickOne(10, 20, MySpecialRule1));
    Console.WriteLine(PickOne(10, 20, MySpecialRule2));
    

    运行后控制台输出 “10” 和 “20”

  4. 泛型委托

    • C#支持泛型委托

    • 为避免每次都声明委托,可使用 .NET 提供的泛型强类型委托,如 Action(无返回值)和 Func(有返回值)。

    • Action 和 Func 有多个泛型参数版本,最多支持 16 个参数。

  5. 匿名委托与 Lambda 表达式

    • 匿名委托:无需实际声明方法,直接编写匿名委托,符合相应委托要求即可。
      PickOne(10, 20, delegate (int a, int b) {return true;});
      
    • Lambda 表达式:是特殊的委托,最终会被转换为 Action 或 Func。在较新版本的 C# 中,编译器可自动推测 Lambda 表达式对应的强委托类型;在旧版本中,需主动写明委托类型。
      PickOne(10, 20, (a, b) => true);
      
二、事件
  1. 事件的本质:事件是特殊的委托,为了解决委托使用时需在实例化时立即注册方法的问题。

  2. 事件的声明与使用

    • 声明:先有委托类型,然后使用 event 关键字加上委托类型和事件名称来声明事件。事件通常作为类的成员出现。

      delegate void MyDelegate(); // 委托类型声明
      
      event MyDelegate MyEvent; // 实例
      
    • 实例化与调用:在类的实例中,通过事件名称添加事件处理程序(如使用 Lambda 表达式)。
      事件作为类的成员时只能在类的内部进行调用,调用时直接调用MyEvent(),或者使用 ?.Invoke() 避免因未注册事件而报错。

  3. 事件的常见使用场景

    • 当类中的某些成员(如属性、容器中的元素)发生变化时,希望外部能够观测到这些变化,可在类中声明事件,外部通过注册事件处理程序来观测。

      例如
      在自定义类中声明 MyValueChange 事件,当 MyValue 属性变化时触发该事件;
      ObservableCollection 集合有 CollectionChanged 事件,当对其进行增加、删除等操作时会触发该事件。

  4. 标准 .NET 事件模式

    • 委托类型:.NET 提供了 EventHandler 委托,返回值是 void,传参为 object sender 和 EventArgs e,用于处理常见的事件,如界面上的按钮点击事件、集合变化事件等。

    • 事件参数类型:EventArgs 是一个基类,里面没有字段,可创建其子类来传递更多有效信息。不同的事件可能对应不同的 EventArgs 子类,如 Button 的 Click 事件对应 RoutedEventArgs,其中包含事件相关的详细信息(如按下哪个按钮、事件是否被处理等)。

    • 命名规范

      ▪ 事件命名:推荐使用名词 + 动词被动形式,且动词被动最好以 ed 结尾,如 CollectionChanged、PropertyChanged、EventRaised 等;也有一些常见事件不严格遵循此规则,如 Button 的 Click 事件、KeyDown 事件等。

      ▪ 事件处理方法命名:一般在事件名称前加 On(表示事件发生的那一刻,如 OnPropertyChanged)或 Raise(后面可不用被动语态,如 RaisePropertyChange)。

提示词工程在机器翻译质量提升中的应用 Introduction to Prompt Engineering in Machine Translation Quality Improvement Keywords 阅读详情

相关推荐

什么是plm系统?-数字化转型网

当今世界,产品研发能力是企业在激烈的市场竞争中保持战略优势的核心竞争力之一。如何有效地缩短产品研发周期、改善产品服务的设计迭代流程、有效降低产品的研发成本,也是企业面临的主要问题之一。PLM(Product Lifecycle Management,产品生命周期管理)在优化产品研发的全管理流程、增强企业产品的市场竞争力方面具有关键的作用。

cxo17757154043的博客 883

C#中的委托与事件笔记——进阶

可以像自定义属性一样自定义事件的。

WDaMu的博客 977

贴片二极管SOD封装详解:SOD-123/323/523尺寸焊盘设计要点

表面贴装技术中,二极管封装尺寸直接决定PCB布局与焊接可靠性。SOD封装作为小外形二极管的主流形态,其SOD-123、SOD-323、SOD-523三种规格分别对应不同的功耗与占板面积权衡。理解封装尺寸、焊盘设计计算逻辑和钢网开窗原理,是避免立碑、虚焊等工艺缺陷的关键。在可穿戴设备、电源保护等空间受限场景中,合理选择封装不仅能优化散热路径,还能提升量产良率。本文从焊盘计算、工艺要点到选型策略,全面解析SOD封装的工程实践。

weixin_42520780的博客 305

C#委托与事件学习笔记

今天跟随视频学习了一下C#中最重要的一些概念之委托与事件。老杨的视频讲的还是挺深入浅出,不过刚接触C#.NET的人还是朦朦胧胧,就像张子阳先生说的“每次见到委托和事件就觉得心里别(biè)得慌,混身不自在”。跨过这道坎的人就有种一览众山小的感觉了。我又浏览了皱华栋老师JamesZou的博文《深入理解C#委托及原理》(地址:http://www.cnblogs.com/jameszou/...

weixin_30602505的博客 128

Linux内存优化:KSM技术原理与实践指南

内存共享是提升虚拟化环境资源利用率的关键技术,其核心原理是通过识别相同内容的内存页进行合并。Linux内核的KSM(Kernel Samepage Merging)机制采用红黑树数据结构管理内存页,通过多级哈希比较算法实现高效合并。该技术能显著降低物理内存消耗,提升CPU缓存命中率,特别适用于运行大量相似虚拟机实例的场景。在容器化和云计算环境中,KSM与NUMA优化、内存气球等技术协同,可实现40%-60%的内存节省。典型应用包括金融云平台的高密度虚拟机部署,以及Kubernetes集群的基础镜像优化。

weixin_28730353的博客 369

二、时间序列的预处理

一般情况下,拿到一个观察值序列之后,首先要对它的平稳性和纯随机性进行检验,这两个重要的检验称为序列的预处理。根据检验的结果可以将序列分为不同的类型,对不同类型的序列我们会采用不同的分析方法。 一、平稳性检验 1、特征统计量 (1)概率分布           数理统计的基础知识告诉我们分布函数或者密度函数能够完整地描述一个随机变量的统计特征。同样,一个堆积变量族{Xt} 的统计特征也完全由...

Nicole的博客 2万+

【C#学习笔记】委托与事件 (从观察者模式看C#的委托与事件)

本文针对C#的委托和事件,详述了委托的使用、异步委托、多播委托、事件的使用、事件访问器等基本知识,并利用ildasm工具查看编译后代码,探索委托和事件的本质和区别。同时研究了委托和事件背后的观察者模式,辨析了接口形式的实现方式和委托的区别。

1566

车辆TBOX科普 第64次 TBOX系统集成测试与文档编写

汽车电子开发中,TBOX作为核心网关面临独特挑战:需处理多网络接口、满足严苛安全标准并确保10年以上可靠性。项目文档是开发流程的核心资产,必须与编码同步更新,构建从需求到测试的完整闭环。系统集成测试需分层进行,结合硬件在环测试和自动化工具,并严格管理缺陷。文档与测试深度协同,通过追溯矩阵确保每个需求都被覆盖验证。最终交付不仅是软件包,更是一套包含完整验证报告的信任体系。这种严谨的工程纪律,是将代码转化为车规级可靠产品的关键保障。

IT深耕十余载,大道之简 1320

C#笔记-委托和事件

1.委托 委托是一种间接使用方法的变量类型,其可以调用匹配与特定方法签名的任意方法。事件是类的一种重要成员,其可根据用户操作触发相应机制,执行命令并反馈结果 事件和委托紧密相关,绝大多数委托的应用都是基于事件的。 委托的特点: 1、委托是一种引用类型,虽然在定义委托时与方法有些相似,但不能将其称为方法。 2、从数据结构来讲,委托是和类一样是一种用户自定义类型。 3、委托是方法的抽象,它存储的就是一系列具有相同签名和返回回类型的方法的地址。 4、调用委托的时候,委托包含的所有方法将被执行。

weixin_57775009的博客 170

addr2line解析不出来行号的解决方式(汇编解析高阶版)

摘要:本文针对AEC crash问题中addr2line无法解析行号的情况,通过llvm-addr2line和反汇编分析,定位到CamX::AECBEStats17::AdjustROIParams函数中的乘法溢出问题。关键发现包括: 常规addr2line只能解析到函数名但无具体行号 llvm-addr2line解析出多个可能溢出点(行196/204/211/218/270/271) 反汇编显示6个条件分支跳转到溢出处理函数 源码分析确认这些位置均存在乘法运算 最终通过汇编级调试工具成功定位UBsan报告

168

手把手教你学simulink实例--基于Simulink的船舶动力定位系统建模与仿真

船舶动力定位系统(Dynamic Positioning System, DPS)是一种通过控制推进器来保持船舶在指定位置和航向的技术。它广泛应用于海上钻井平台、海洋调查船、起重船等需要精确位置控制的场景。DPS的核心任务是实时感知环境干扰(如风、浪、流),并通过闭环控制算法调整推进器输出,以抵消外界扰动并维持船舶的位置和姿态。本项目旨在基于MATLAB/Simulink平台,构建船舶动力定位系统的数学模型,并进行仿真分析,验证其性能和稳定性。

MHD0815的博客 1083

C#学习笔记8:接口、委托、事件

今日继续我的C#学习之路,今日学习接口、委托、事件 文章从实践出发学习这三个设计理念,并提供完整源码

NULL指向我的博客 1992

视觉SLAM十四讲slambook2示例代码所有依赖库的编译安装教程(VTK、OpenCV3、ceres、Sophus、g2o、Eigen、Pangolin、googletest等)

这是2021年的最后一篇博客~ 新年快乐! 0 准备工作   首先需要先安装cmake编译器: sudo apt-get install cmake   以及,将十四讲的示例代码克隆下来(十四讲的源码地址点击这里): git clone --recursive https://github.com/gaoxiang12/slambook2.git   由于里面的3rdparty文件夹内所有内容都来自于其他github仓库,所以需要加上--recursive参数,不然克隆下来的内容不完整。   如果你.

zeeq的博客 7839

C#委托与事件个人笔记

最近做的项目中涉及到使用委托这一技术,由于之前接触过但是并没有完全弄清楚,于是写下这篇博客当做学习的记录。 这里抛出几个问题,当做学习的引导: 一.什么是委托? 二.委托怎么用? 三.什么是事件? 四. 什么是匿名方法? 五.什么是Lambda表达式? 六.什么是Action委托? 七.什么是Func委托? 一.什么是委托? 按照国际惯例,这里引用百度百科的解释: 委托是一个...

不疯魔不成活 240

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Unity C#笔记 委托&事件

C#的委托与事件搭配,即是观察者模式的一种实现。 因为观察者模式的原理很易懂,不作多讲,本文纯粹用于记录语法。 delegate(委托) //声明没有参数,没有返回值的委托类型XXXX public delegate void XXXX(); 声明一个委托类型(类似typedef XXXX C++/C的函数类型) 注:不是产生一个对象。 然后利用声明出来的委托类型,我们可以利用它的对象,赋予其...

weixin_34309543的博客 131

老版QQ原生表情gif动态

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

C#笔记—1(委托机制和事件机制)

C#笔记-1(委托机制和事件机制) 文章目录C#笔记-1(委托机制和事件机制)前言一、几种基础的委托结构(Delegate)二、事件(Event)总结 前言 C#自学笔记,主要记录一些重要的C#特征内容,对于大多数编程语言相通相似的部分不再记录,本笔记便于快速回顾c#的语法特点 一、几种基础的委托结构(Delegate) 自定义委托 语法: delegate 返回类型 委托名([参数]); Action内置委托 语法: Action<[参数类型0-16个]> 委托名=被委托方法名; Fun

宝全哥哥的博客 1707

OV9734 DATASHEET,完整规格书

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

C#简单笔记09:委托,事件

委托 建议:有C基础的,不妨把委托当做函数指针 委托-菜鸟教程https://www.runoob.com/csharp/csharp-delegate.html C#教程-委托(微软文档)https://docs.microsoft.com/zh-cn/dotnet/csharp/tour-of-csharp/delegates C#指南-编程指南-委托(微软文档)https://d...

ishenjiaming的博客 327

【C#学习笔记】委托和事件

在 .NET 中委托提供后期绑定机制。 后期绑定意味着调用方在你所创建的算法中至少提供一个方法来实现算法的一部分。 说的更简单一点,我们可以通过调用委托实现一大串方法的处理。委托像是一个装函数的容器,在我之前的文章里,将其比作了服务员点菜时写的小单子,当触发委托的时候,就是将单子交给后厨,厨师就会按顺序做出我们点的菜。

milu_ELK的博客 741

C#笔记 委托与事件

 本文内容:   1.  委托定义   2.  申明委托   3. 委托的实例化   4. 委托的调用   5. 匿名方法   6. 委托程序实例    7. 事件定义   8. 事件的申明   9. 事件的调用   10. 事件订阅与移除   11. 事件程序实例    12. 标准化事件的设计       1. 委托定义 委托(Delegate)

shuiyingzi5的专栏 589

C#学习笔记一 委托、事件

笔记

u014390786的博客 495

C#笔记 委托 事件 匿各方法 Action

事件event 委托delegate 的基本用法。事件和委托的区别。匿名函数是什么。

fjl2007的博客 5375

[学习笔记][C#]委托与事件的区别

委托是一种,表示对具有特定参数列表和返回类型的方法的引用。它可以看作是一个,允许你在运行时。委托可以绑定多个方法,这些方法会按顺序被调用。委托示例事件是基于,用于多播委托并限制其访问权限。事件在类的外部只能被触发(调用)和订阅(注册/取消注册),不能直接赋值或清空。这种机制增加了安全性和封装性,确保事件只能由定义它的类来触发。事件示例。

DoorToZen的博客 436

C#学习笔记之委托和事件

什么是委托? 是用户自定义类型。 一个委托里面存有一个 具有相同返回值和签名的方法 的列表。 当委托被调用时,委托内的方法列表的每一个方法都会被调用。 委托内保存的方法可以来自任何类或结构,可以是实例方法也可以是静态方法 基本使用 声明委托类型 格式: delegate int NumberChanger(int n); //该委托可用于引用带有一个整型参数的方法,并返回一个整型值。 static int num = 10; public static int AddNum(int

BrilliantMonkey的博客 273

C#中的委托和事件——学习笔记

原文地址:http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx 

a400924618的专栏 381

C# 委托和事件 笔记

参考:C#事件解析 徐洪军    C#委托,事件理解入门 finesite    委托与事件代码详解 kein 上面的几位前辈写的文章都很好,这里只是总结一下。 一、什么是委托和事件 委托仅仅是函数指针,它能够引用函数,通过传递地址的机制完成,委托是一个类,对委托实例化时,要提供一个引用函 数,将它作为构造函数的参数。每一个委托都有一个签名,被引用的函数必须和委托有相同的签名...

weixin_30646315的博客 137
上一篇: 结构型设计模式之桥接模式
下一篇: C#中的委托与事件笔记——进阶
WDaMu
博客等级 码龄4年 27粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值