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

C#委托与事件

在C#中,委托(Delegates)和事件(Events)是用于实现事件驱动编程的关键组件。

委托(Delegates)

委托是一种特殊的类型,它定义了方法的签名(即方法的返回类型和参数类型),并可以持有对具有相同签名的方法的引用。通过委托,你可以将方法当作参数传递、存储在变量中或者作为其他方法的返回值。这使得编程更加灵活,尤其是在设计回调方法或者异步处理时。

委托的声明和使用
// 声明一个委托,它可以引用任何返回void且接受两个int参数的方法。
public delegate void MyDelegate(int a, int b);public class Program
{// 一个符合委托签名的方法public static void Add(int x, int y){Console.WriteLine($"{x} + {y} = {x + y}");}// 另一个符合委托签名的方法public static void Subtract(int x, int y){Console.WriteLine($"{x} - {y} = {x - y}");}public static void Main(){// 创建委托实例并关联到Add方法MyDelegate del = new MyDelegate(Add);// 通过委托调用方法del(10, 20); // 输出: 10 + 20 = 30// 将委托关联到Subtract方法del = Subtract;// 再次通过委托调用方法del(10, 5); // 输出: 10 - 5 = 5}
}

事件(Events)

事件是一种使类或对象可以通知其他类或对象发生了某些事情的机制。在定义事件的类中,它通常是基于某个委托类型的字段,不过它使用了特殊的事件语法和两个附加的访问器 addremove 来管理委托的订阅者列表。

事件的声明和使用
// 声明一个委托
public delegate void MyEventHandler(string message);public class Publisher
{// 声明一个事件,基于上面的委托public event MyEventHandler SomethingHappened;// 触发事件的方法public void DoSomething(string message){// 触发事件SomethingHappened?.Invoke(message);}
}public class Subscriber
{// 事件处理器public void OnSomethingHappened(string message){Console.WriteLine($"Received message: {message}");}
}public class Program
{public static void Main(){Publisher publisher = new Publisher();Subscriber subscriber = new Subscriber();// 订阅事件publisher.SomethingHappened += subscriber.OnSomethingHappened;// 触发事件publisher.DoSomething("Hello, World!"); // 输出: Received message: Hello, World!// 取消订阅事件publisher.SomethingHappened -= subscriber.OnSomethingHappened;// 再次触发事件,由于没有订阅者,所以没有输出publisher.DoSomething("Hello again!");}
}

在上面的例子中,Publisher 类有一个名为 SomethingHappened 的事件,和一个触发该事件的方法 DoSomethingSubscriber 类有一个方法 OnSomethingHappened,它将被用作事件的处理器。在 Main 方法中,创建了 PublisherSubscriber 的实例,并将 subscriber.OnSomethingHappened 方法订阅到 publisher.SomethingHappened 事件。当 DoSomething 被调用时,它将触发事件,从而导致 OnSomethingHappened 方法被调用。如果取消订阅,那么 DoSomething 的调用将不会有任何效果,因为没有事件处理器与之关联。

相关文章:

  • Azure 机器学习:使用 Azure 机器学习 CLI、SDK 和 REST API 训练模型
  • git 指定时间代码统计
  • 【EI会议征稿】第四届环境资源与能源工程国际学术会议(ICEREE 2024)
  • kotlin--2.面向对象
  • 无线WiFi安全渗透与攻防(N.1)WPA渗透-pyrit:batch-table加速attack_db模块加速_“attack_db”模块加速
  • U盘不能访问不一定是坏了,可能还有其他原因!U盘无法访问修复详解
  • Python爬虫批量下载图片
  • 监控直流防雷浪涌保护器综合方案
  • 软考 系统架构设计师系列知识点之云计算(3)
  • 商城免费搭建之java商城 java电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c
  • windows服务器热备、负载均衡配置
  • 性能测试 —— Jmeter接口处理不低于200次/秒-场景
  • 高性能音乐流媒体服务Diosic
  • AI绘画API:提升艺术创作的效率和品质
  • java绘制心形爱心
  • 0基础学习移动端适配
  • CEF与代理
  • create-react-app做的留言板
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • mysql 数据库四种事务隔离级别
  • Protobuf3语言指南
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • react-native 安卓真机环境搭建
  • 服务器从安装到部署全过程(二)
  • 解析带emoji和链接的聊天系统消息
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 字符串匹配基础上
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • 移动端高清、多屏适配方案
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • #Spring-boot高级
  • (003)SlickEdit Unity的补全
  • (26)4.7 字符函数和字符串函数
  • (C语言)逆序输出字符串
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (论文阅读30/100)Convolutional Pose Machines
  • (算法二)滑动窗口
  • (转)母版页和相对路径
  • (转)人的集合论——移山之道
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET Core 成都线下面基会拉开序幕
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .net 程序发生了一个不可捕获的异常
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .NET大文件上传知识整理
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • [ 蓝桥杯Web真题 ]-Markdown 文档解析
  • [C++核心编程](四):类和对象——封装
  • [CF494C]Helping People