当前位置: 首页 > news >正文

详解C#委托与事件

在C#中,委托是一种引用类型的数据类型,允许我们封装方法的引用。通过使用委托,我们可以将方法作为参数传递给其他方法,或者将多个方法组合在一起,从而实现更灵活的编程模式。委托类似于函数指针,但提供了类型安全和垃圾回收等现代语言特性。

基本概念

定义委托

定义委托需要指定它所代表的方法的原型,包括返回类型和参数列表。例如:

public delegate int MyDelegate(int a, int b);

这定义了一个名为MyDelegate的委托,它代表一个接受两个整数参数并返回一个整数的方法。

创建委托实例

创建委托实例时,可以使用new关键字加上委托类型和要封装的方法名:

MyDelegate myDelegate = new MyDelegate(AddNumbers);

其中AddNumbers是一个符合MyDelegate定义的方法。

调用委托

一旦有了委托实例,就可以像调用方法一样调用它:

int result = myDelegate(5, 3);

多播委托

委托可以被设计为“多播”的,这意味着它们可以调用多个方法。当调用多播委托时,所有注册的方法都会按顺序执行:

MyDelegate del1 = new MyDelegate(AddNumbers);
MyDelegate del2 = new MyDelegate(MultiplyNumbers);
MyDelegate combinedDel = del1 + del2;
combinedDel(5, 3); // 先调用 AddNumbers, 然后调用 MultiplyNumbers

匿名方法和Lambda表达式

从C# 2.0开始,可以使用匿名方法来定义委托:

MyDelegate anonMethod = delegate(int x, int y) { return x + y; };

而在C# 3.0之后,Lambda表达式成为更简洁的选择:

MyDelegate lambdaExpr = (int x, int y) => x + y;

事件

在C#中,事件是一种特殊的委托类型,用于封装消息的发送机制,通常用于组件之间或对象之间的通信。事件是.NET框架中处理异步操作、UI交互和信号通知的核心机制。下面详细介绍事件的概念、定义和使用。

事件的基本概念

事件允许一个类(事件发布者)向另一个或多个类(事件订阅者)广播信息,而无需直接调用接收方的任何方法。这实现了发布者和订阅者之间的解耦,使得代码更加模块化和可维护。

定义事件

事件基于委托类型定义,通常使用System.EventHandler或自定义的委托类型。定义事件时,通常在类中声明一个委托类型的私有字段,并在此基础上声明一个公共的事件属性。例如:

public class Publisher
{// 自定义委托类型public delegate void MyEventHandler(object source, MyEventArgs args);// 定义事件private event MyEventHandler myEvent;// 使用事件属性暴露事件public event MyEventHandler MyEvent{add { myEvent += value; }remove { myEvent -= value; }}// 触发事件public void RaiseEvent(){if (myEvent != null){myEvent(this, new MyEventArgs());}}
}

在这个例子中,Publisher类有一个名为MyEvent的事件,它基于MyEventHandler委托类型。事件触发时,RaiseEvent方法会被调用,它会检查是否有订阅者,并调用所有订阅者的相应方法。

订阅和取消订阅事件

事件可以通过事件处理程序来订阅。事件处理程序是一个与事件委托类型匹配的方法。订阅事件时,将事件处理程序添加到事件中;取消订阅则移除该处理程序。

class Subscriber
{public void OnMyEvent(object sender, MyEventArgs e){Console.WriteLine("Event triggered.");}
}// 在某个地方订阅事件
Publisher publisher = new Publisher();
Subscriber subscriber = new Subscriber();
publisher.MyEvent += subscriber.OnMyEvent;// 取消订阅事件
publisher.MyEvent -= subscriber.OnMyEvent;

使用事件参数

事件经常与事件参数一起使用,这些参数通常封装了事件发生时的附加信息。事件参数是通过继承EventArgs类来创建的。例如:

public class MyEventArgs : EventArgs
{public string Message { get; set; }
}

在触发事件时,可以创建事件参数的实例并传递给事件:

public void RaiseEvent()
{if (myEvent != null){myEvent(this, new MyEventArgs { Message = "Hello, world!" });}
}

文章转载自:Y00

原文链接:https://www.cnblogs.com/ayic/p/18295844

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • docker inspect 如何提取容器的ip和端口 网络信息?
  • 【JavaScript】聊一聊js中的浅拷贝与深拷贝与手写实现
  • 【vue教程】二. Vue特性原理详解
  • 漏洞挖掘 | EDU拿敏感信息的骚思路
  • 如何构建全生命周期的安全体系架构来确保容器的安全?
  • ARM功耗管理之功耗数据与功耗收益评估
  • FastAPI 学习之路(四十九)WebSockets(五)修复接口测试中的问题
  • ScrapySharp框架:小红书视频数据采集的API集成与应用
  • 使用Docker创建并运行一个create-react-app应用(超简单)
  • 新手-前端生态
  • Qt中https的使用,报错TLS initialization failed和不能打开ssl.lib问题解决
  • Spring Boot(八十):Tesseract实现图片文字自动识别
  • Linux Zip 命令指南
  • [Spring] Spring Web MVC案例实战
  • SpringCloud集成kafka集群
  • Android交互
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • E-HPC支持多队列管理和自动伸缩
  • isset在php5.6-和php7.0+的一些差异
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • Java比较器对数组,集合排序
  • js
  • Leetcode 27 Remove Element
  • leetcode98. Validate Binary Search Tree
  • linux学习笔记
  • markdown编辑器简评
  • Node项目之评分系统(二)- 数据库设计
  • Rancher-k8s加速安装文档
  • React Native移动开发实战-3-实现页面间的数据传递
  • ReactNativeweexDeviceOne对比
  • Selenium实战教程系列(二)---元素定位
  • SQLServer之创建显式事务
  • Vue小说阅读器(仿追书神器)
  • Windows Containers 大冒险: 容器网络
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 从tcpdump抓包看TCP/IP协议
  • 飞驰在Mesos的涡轮引擎上
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 听说你叫Java(二)–Servlet请求
  • 微信小程序:实现悬浮返回和分享按钮
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #HarmonyOS:Web组件的使用
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #数学建模# 线性规划问题的Matlab求解
  • #知识分享#笔记#学习方法
  • (33)STM32——485实验笔记
  • (C++)八皇后问题
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (六)Hibernate的二级缓存
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解