C# event的使用

在C#中,事件(Event)是一种特殊的成员,它允许类或对象以类型安全的方式向外界发出通知,表明某个特定的行为或状态变化已经发生。

订阅该事件的其他类可以定义处理方法来响应这些通知。

事件主要基于委托机制实现,是C#编程中实现观察者模式和发布-订阅模型的关键部分。

以下是如何在C#中声明、引发(raise)和订阅事件的基本步骤:

 

声明事件

首先,你需要定义一个委托类型,这个委托类型对应事件处理方法的签名。然后使用event关键字声明事件。

public delegate void MyEventHandler(object sender, EventArgs e); // 声明一个委托类型public class PublisherClass
{public event MyEventHandler MyEvent; // 声明一个事件
}

 

订阅事件

在订阅者类中,你可以通过.+=操作符来添加一个事件处理方法到事件的订阅列表中。

public class SubscriberClass
{private PublisherClass publisher;public SubscriberClass(PublisherClass p){publisher = p;publisher.MyEvent += OnMyEvent; // 订阅事件}private void OnMyEvent(object sender, EventArgs e){Console.WriteLine("Event has been raised by " + sender.ToString());// 这里执行事件处理逻辑}
}

 

触发事件

在发布者类内部,当特定条件满足时,可以通过调用事件的.Invoke()方法来触发事件。

public class PublisherClass
{// ...public void DoSomething(){// 当需要触发事件时OnMyEvent?.Invoke(this, EventArgs.Empty);}protected virtual void OnMyEvent(EventArgs e){MyEvent?.Invoke(this, e); // 安全地引发事件,防止null引用异常}
}

 

移除事件订阅

通过.-=操作符可以取消对事件的订阅。

public class SubscriberClass
{// ...~SubscriberClass() // 或在适当的时候解除订阅{publisher.MyEvent -= OnMyEvent; // 取消订阅事件}
}

 

注意点

  • 使用?.Invoke()是为了避免在没有订阅者的情况下尝试调用事件导致的NullReferenceException。
  • OnMyEvent是一个保护的虚方法,通常用于在类内部引发事件,子类可以根据需要重写此方法。
  • 事件名称通常以On开头,例如OnButtonClick,遵循C#的命名规范。
  • 事件参数通常是EventArgs或其派生类,包含与事件相关的信息。
  • 事件只能使用+=操作符来订阅,使用-=操作符来取消订阅。这确保了事件的封装性,即外部代码不能直接调用事件。
  • 事件内部通常使用受保护的虚拟方法(如OnMyEvent)来触发事件,这样派生类可以重写事件触发逻辑。
  • 事件的类型通常是委托类型,它定义了可以订阅事件的方法的签名。
  • 自定义的事件参数类(如MyEventArgs)通常继承自EventArgs类,并包含与事件相关的数据。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/744526.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript进阶2之执行上下文、作用域链、函数创建、函数激活、checkScope的执行过程、闭包、this

JavaScript进阶 执行上下文执行上下文中的属性变量对象全局上下文的变量对象函数上下文执行过程进入执行上下文代码执行思考题 作用域链函数创建函数激活checkScope的执行过程总结 闭包分析闭包 this 执行上下文 执行上下文中的属性 每一个执行上下文都有三个核心属性 变量对…

【趣味项目】一键生成LICENSE

【趣味项目】一键生成LICENSE 项目地址:GitHub(最新版本) | GitCode(旧版本) 项目介绍 一款用于自动生成开源项目协议的工具,可以通过 npm 进行安装后在命令行使用,非常方便 使用方式 npm install xxhls/get-license -gget-license --l…

python的函数与类的定义

目录 1.函数 1.函数的定义 2.输入参数与输出参数的类型 3.输入和输出多个参数 1.普通参数 2.含有任意数量的参数 3.关键字参数 4.普通参数与多个参数的结合 2.类 1.类的定义 2.类的实例化 3.继承 1.函数 1.函数的定义 def 函数名(输入参数): 文档字符串 函数体 …

第七届国际通信与网络工程会议(ICCNE 2024)即将召开!

2024年第七届国际通信与网络工程会议(ICCNE 2024)将于7月26-28日在越南岘港召开。本次会议由维新大学主办,岘港大学、胡志明市科技大学协办。ICCNE 2024旨在为来自行业和学术界的研究人员、从业者和专业人士提供论坛,分享其最新研…

基于boost库的搜索引擎项目

文章目录 一、项目背景二、什么样的搜索引擎三、搜索引擎的宏观图原理四、Parse模块4.1下载boost库源代码4.2提取boost库中以.html为结尾的文件4.2.1 boost库的简单使用 4.3数据清洗(去标签化)4.3.1数据清洗的具体实现 4.4将清洗后的数据写入到raw.txt文件中 五、正排索引 vs 倒…

C++面试问题收集

0 持续更新中 目录 0 持续更新中 1 C语言相关 1.1 malloc/free和new/delete区别 1.2 内存泄漏 1.3 堆区和栈区的区别 1.4 宏定义和const的区别 1.5 多态 1.6 类中的静态成员变量 2 操作系统相关 2.1 进程和(用户)线程的区别 2.2 系统调用 2.3…

学习SSM的记录(七)-- SSM整合

目录 SSM整合理解 什么是SSM整合 SSM整合核心问题 1.SSM整合需要几个ioc容器 2.每一个ioc容器对应哪些类型组件 ​编辑 3.ioc容器之间关系和调用方向 4.具体多少配置类以及对应容器关系 5.ioc初始化方式和配置位置 ​编辑 SSM整合配置实战 1.数据库准备 2.创建项目…

十分钟教你有效运用百度检索式

十分钟教你有效运用百度检索式 ​ 百度作为国内最大的搜索引擎网站,虽然很多人都喷它的搜索页面广告太多,但是对于不会科学上网的同学来说,似乎除了继续用百度以外也没有更好的选择。 ​ 其实搜索引擎一般都会内涵一些高级的搜索技巧&#…

中间件漏洞(redis)

目录 1.Redis服务器被挖矿案例 2.redis常见用途 3.redis环境配置 4.redis的持久化机制 5.redis动态修改配置 6.webshell提权案例 7.定时任务bash反弹连接提权案例 8.SSH Key提权案例 9.redis安全加固分析 1.Redis服务器被挖矿案例 我没有体验过,那就看看别…

【Redis】Redis常用命令一

1.keys:返回所有满足条件的key,比如: KEYS pattern时间复杂度:O(N),返回值:匹配pattern的所有key。 • h?llo 匹配 hello , hallo 和 hxllo • h*llo 匹配 hllo 和 heeeello • h[ae]llo 匹配 hello 和 …

Java解决一年中的第几天

Java解决一年中的第几天 01 题目 给你一个字符串 date ,按 YYYY-MM-DD 格式表示一个 现行公元纪年法 日期。返回该日期是当年的第几天。 示例 1: 输入:date "2019-01-09" 输出:9 解释:给定日期是2019年的第…

【CSP试题回顾】201709-1-打酱油

CSP-201709-1-打酱油 解题代码 #include<iostream> using namespace std;int n, num;int main() { cin >> n;if (n / 50 ! 0){num 7 * (n / 50);n % 50;}if (n / 30 ! 0){num 4 * (n / 30);n % 30;}if (n / 10 ! 0) num (n / 10);cout << num;return…

python基础知识总结

一、Python数据结构 不可变数据结构&#xff08;3 个&#xff09;&#xff1a;Number&#xff08;整数&#xff09;、String&#xff08;字符串&#xff09;、Tuple&#xff08;元组&#xff09; 可变数据结构&#xff08;3 个&#xff09;&#xff1a;List&#xff08;列表&am…

Flask 专题

[CISCN2019 总决赛 Day1 Web3]Flask Message Board 查看session解密 但不知道密钥&#xff0c;题目说FLASK,那肯定就是找密钥,发现输入什么都没有显示&#xff0c;只有author那里有回显在版上&#xff0c;所以尝试sstl&#xff0c;{{config}}找到密钥 扫目录发现有admin进入…

6个免费的3D模型网站,助你3D建模渲染不用愁

​随着3D建模和渲染技术的不断发展&#xff0c;其重要性也日益增加。创建新的3D模型往往需要耗费大量时间&#xff0c;因此&#xff0c;本文整理了六个顶尖的免费3D模型资源网站&#xff0c;以便您能够方便地获取3D模型&#xff0c;大幅减少建模时间。这些资源有助于您更快地开…

考研408 2011年 第42题 (数据结构——队列)

#include <stdio.h>int MidSearch(int *A,int *B,int n) {//分别表示序列A到序列B的首位元素&#xff0c;末位数和中位数。s是star简写&#xff0c;d是end简写int s10,d1n-1,m1,s20,d2n-1,m2;//循环判断结束条件是&#xff0c;两个数组均不断删除 最后均只能剩余一个元素…

高铁地铁智慧公厕方案与案例介绍

随着轨道交通的快速发展&#xff0c;高铁、地铁、火车成为人们出行的主要交通工具。而在这种规划建设要求极具的场所&#xff0c;信息化、智慧化的管理系统部署必不可少&#xff0c;智慧公厕作为公共设施的重要组成部分&#xff0c;建设和管理也越来越受到重视。智慧公厕系统的…

线性回归啊

import torch import matplotlib.pyplot as pltx_data torch.Tensor([ [1.0],[2.0],[3.0] ]) y_data torch.Tensor([ [2.0],[4.0],[6.0] ])损失如果计算为向量是无法构建计算图 第一个参数 1 表示输入特征的数量&#xff0c;也就是模型接收的每个样本的特征数量。在这个例…

elasticsearch(学习笔记)(分布式搜索引擎)(黑马)(kibana操作)

一、索引库操作 索引库就类似数据库表&#xff0c;mapping映射就类似表的结构。 我们要向es中存储数据&#xff0c;必须先创建“库”和“表”。 1、mapping映射属性 mapping是对索引库中文档的约束&#xff0c;常见的mapping属性包括&#xff1a; type&#xff1a;字段数据类型…

自动驾驶最强学习资料

自动驾驶最强学习资料 资料说明和获取方式 本资料包是作者吐血整理的干货&#xff01;目前为止应该是非常全的自动驾驶资料包&#xff01;是作者五年自动驾驶算法工程师的 积累&#xff01; 以上干货资料并不全是作者自己原创&#xff0c; 是作者作为五年自动驾驶算法工程的…