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

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类,并包含与事件相关的数据。

 

 

相关文章:

C# event的使用

在C#中,事件(Event)是一种特殊的成员,它允许类或对象以类型安全的方式向外界发出通知,表明某个特定的行为或状态变化已经发生。 订阅该事件的其他类可以定义处理方法来响应这些通知。 事件主要基于委托机制实现&…...

外包干了9天,技术退步明显。。。。。

先说一下自己的情况,本科生,2018年我通过校招踏入了南京一家软件公司,开始了我的职业生涯。那时的我,满怀热血和憧憬,期待着在这个行业中闯出一片天地。然而,随着时间的推移,我发现自己逐渐陷入…...

Android Framework 之 Python

当然可以,我会尽量提供更详细的内容,并增加更多的例子和解释。以下是更详细的Python语言教程: Python语言教程 一、Python简介 Python是一种高级编程语言,由Guido van Rossum于1989年底发明,第一个公开发行版发行于…...

【Fitten Code】“吊打“Github Copilot的国内免费代码辅助插件

🌻个人主页:相洋同学 🥇学习在于行动、总结和坚持,共勉! 目录 1.Github Copilot 2.Fitten Code 2.1 对话体验: 2.2 代码补全体验: 2.3 Pycharm安装方法: 2.4 Vscode安装方法…...

Git中的换行符CRLF和LF问题

目录 第一章、问题分析1.1)Git报错提示1.2)报错分析 第二章、解决方式2.1)在Windows上开发并需要与Unix或macOS上的开发人员协作2.1)在Unix或macOS开发并需要与Windows上的开发人员协作2.3)不需要与其他操作系统的开发…...

go语言文件操作

标准流的操作 从标准输入中查找重复的行 // 从标准输入中查找重复的行 func main() {counts : make(map[string]int, 0)scanner : bufio.NewScanner(os.Stdin) for scanner.Scan() {counts[scanner.Text()]}for key, value : range counts {if value > 1 {fmt.Println(&quo…...

七月论文审稿GPT第3.2版和第3.5版:通过paper-review数据集分别微调Mistral、gemma

前言 我司第二项目组一直在迭代论文审稿GPT(对应的第二项目组成员除我之外,包括:阿荀、阿李、鸿飞、文弱等人),比如 七月论文审稿GPT第1版:通过3万多篇paper和10多万的review数据微调RWKV七月论文审稿GPT第2版:用一万…...

QML 自定义时间编辑控件

一.展示效果 qml自定义时间编辑控件 二.主界面调用 //main.qml import QtQuick 2.12 import QtQuick.Controls 2.5 import QtQuick.Window 2.12 import "./qml"Window {visible: truewidth: 400height: 300title: qsTr("Hello World")property date origi…...

后端程序员入门react笔记(八)-redux的使用和项目搭建

一个更好用的文档 添加链接描述 箭头函数的简化 //简化前 function countIncreAction(data) {return {type:"INCREMENT",data} } //简化后 const countIncreAction data>({type:"INCREMENT",data })react UI组件库相关资料 组件库连接和推荐 antd组…...

深度学习 精选笔记(13.2)深度卷积神经网络-AlexNet模型

学习参考: 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增),以达到集多方教程的精华于一文的目的。 ③非常推荐上面(学习参考&#x…...

【C#图解教程】笔记

文章目录 1. C#和.NET框架.NET框架的组成.NET框架的特点CLRCLICLI的重要组成部分各种缩写 2. C#编程概括标识符命名规则: 多重标记和值格式化数字字符串对齐说明符格式字段标准数字格式说明符标准数字格式说明符 表 3. 类型、存储和变量数据成员和函数成员预定义类型…...

A Workload‑Adaptive Streaming Partitioner for Distributed Graph Stores(2021)

用于分布式图存储的工作负载自适应流分区器 对象:动态流式大图 划分方式:混合割 方法:增量重划分 考虑了图查询算法,基于动态工作负载 考虑了双动态:工作负载动态;图拓扑结构动态 缺点:分配新顶…...

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Search)

搜索框组件,适用于浏览器的搜索内容输入框等应用场景。 说明: 该组件从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 子组件 无 接口 Search(options?: { value?: string, placeholder?: Reso…...

GPIO八种工作模式实践总结

到目前为止我还是没搞懂,GPIO口输入输出模式下,PULLUP、PULLDOWN以及NOPULL之间的区别,从实践角度讲,也就是我亲自测试来看,能划分的区别有以下几点: GPIO_INPUT 在输入模式下使用HAL_GPIO_WritePin不能改变…...

ElementUI两个小坑

1.form表单绑定的是一个对象&#xff0c;表单里的一个输入项是对象的一个属性之一&#xff0c;修改输入项&#xff0c;表单没刷新的问题&#xff0c; <el-form :model"formData" :rules"rules" ref"editForm" class"demo-ruleForm"…...

前端基础——HTML傻瓜式入门(2)

该文章Github地址&#xff1a;https://github.com/AntonyCheng/html-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.c…...

操作系统(AndroidIOS)图像绘图的基本原理

屏幕显示图像的过程 我们知道&#xff0c;屏幕是由一个个物理显示单元组成&#xff0c;每一个单元我们可以称之为一个物理像素点&#xff0c;而每一个像素点可以发出多种颜色。 而图像&#xff0c;就是在不同的物理像素点上显示不同的颜色构成的。 像素点的颜色 像素的颜色是…...

测试用例的设计(2)

目录 1.前言 2.正交排列(正交表) 2.1什么是正交表 2.2正交表的例子 2.3正交表的两个重要性质 3.如何构造一个正交表 3.1下载工具 3.1构造前提 4.场景设计法 5.错误猜测法 1.前言 我们在前面的文章里讲了测试用例的几种设计方法,分别是等价类发,把测试例子划分成不同的类…...

HTML与CSS

前言 Java 程序员一提起前端知识&#xff0c;心情那是五味杂陈&#xff0c;百感交集。 说不学它吧&#xff0c;说不定进公司以后&#xff0c;就会被抓壮丁去时不时写点前端代码说学它吧&#xff0c;HTML、CSS、JavaScript 哪个不得下大功夫才能精通&#xff1f;学一点够不够用…...

App推广不再难!Xinstall神器助你快速获客,提升用户留存

在如今的移动互联网时代&#xff0c;App推广已经成为了各大应用商家争夺用户的重要手段。然而&#xff0c;面对竞争激烈的市场环境&#xff0c;如何快速提升推广效率&#xff0c;先人一步获得用户呢&#xff1f;这就需要我们借助专业的App全渠道统计服务商——Xinstall的力量。…...

SolveSpace:参数化 CAD 软件网页版的实验性突破

【导语&#xff1a;SolveSpace 作为一款参数化二维/三维 CAD 软件&#xff0c;推出了实验性网页版。虽存在速度损失和未解决的 bug&#xff0c;但处理小模型时体验不错&#xff0c;为 CAD 软件的使用带来新可能。】小巧 CAD 软件的网页版尝试SolveSpace 主要以普通桌面软件形式…...

Nano Banana进阶指南:从动漫角色到真人手办场景的AI创意融合

1. Nano Banana创意工作流全解析 第一次接触Nano Banana时&#xff0c;我就被它强大的图像生成能力震撼了。但真正让我着迷的&#xff0c;是它能够将动漫角色、真人cosplay和手办场景这三个看似独立的元素完美融合的能力。这种"三位一体"的创作方式&#xff0c;不仅打…...

Labelme标注神器:从安装到实战,手把手教你打造自己的图像分割数据集

Labelme图像标注实战&#xff1a;从入门到生产级数据集构建 在计算机视觉项目中&#xff0c;数据标注往往是决定模型效果的关键因素。不同于常见的矩形框标注工具&#xff0c;Labelme以其灵活的多边形标注能力和丰富的输出格式支持&#xff0c;成为语义分割任务的首选工具。但很…...

零基础如何用罗技鼠标宏实现绝地求生自动压枪?高效配置指南

零基础如何用罗技鼠标宏实现绝地求生自动压枪&#xff1f;高效配置指南 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 你是否在《绝地求生》中因…...

ERNIE-4.5-0.3B-PT智能合约分析:区块链安全检测系统

ERNIE-4.5-0.3B-PT智能合约分析&#xff1a;区块链安全检测系统 1. 引言 区块链开发者们经常面临一个头疼的问题&#xff1a;智能合约部署后才发现存在安全漏洞&#xff0c;导致资产损失。传统的安全审计需要专业团队花费数天甚至数周时间&#xff0c;成本高昂且效率低下。现…...

OFA-VE环境部署:Python 3.11+PyTorch+CUDA一站式配置手册

OFA-VE环境部署&#xff1a;Python 3.11PyTorchCUDA一站式配置手册 1. 引言&#xff1a;认识OFA-VE视觉推理系统 OFA-VE是一个基于阿里巴巴达摩院OFA大模型构建的多模态推理平台&#xff0c;专门用于分析图像内容与文本描述之间的逻辑关系。这个系统采用了现代化的赛博朋克视…...

SketchUp STL开源工具:让3D设计无缝转化为可打印模型的完整方案

SketchUp STL开源工具&#xff1a;让3D设计无缝转化为可打印模型的完整方案 【免费下载链接】sketchup-stl A SketchUp Ruby Extension that adds STL (STereoLithography) file format import and export. 项目地址: https://gitcode.com/gh_mirrors/sk/sketchup-stl 在…...

深入解析DDR3与AXI接口:基于7035开发板的实战笔记

1. DDR3基础概念与7035开发板适配 第一次接触DDR3时&#xff0c;我也被那些专业术语搞得晕头转向。直到在7035开发板上实际调试后&#xff0c;才发现理解DDR3的关键在于抓住几个核心特性。DDR3全称Double Data Rate 3&#xff0c;顾名思义&#xff0c;它在时钟上升沿和下降沿都…...

【数据结构】树的定义、核心术语与关键性质全解析

在数据结构的世界里&#xff0c;树&#xff08;Tree&#xff09; 是一种极其重要的非线性结构&#xff0c;它完美模拟了自然界中树的层次关系&#xff0c;从文件系统、组织结构&#xff0c;到算法中的二叉搜索树、堆&#xff0c;再到 AI 中的决策树&#xff0c;树的身影无处不在…...

降低AI检测率哪个工具好?10款免费工具2026亲测,亲测有用

很多同学在写论文时都会遇到同一个难题&#xff1a;用AI辅助写完的内容&#xff0c;一查AIGC率高到离谱&#xff0c;被导师打回要求整改。后台最近也收到不少私信问&#xff1a;怎么才能有效降低AI检测率&#xff1f;有没有靠谱的免费降AI率工具推荐&#xff1f; 我自己当初也踩…...