c#中的事件和委托

委托

我们先来说说委托的使用和语法,然后再说概念

声明一个委托变量,这个委托可以在类外面,命名空间内,范围很广泛

using System;namespace ConsoleApp1
{//声明一个委托,无返回值带参数的public delegate void sayHelloDlg(string name);class Program{private static void Main(string[] args){}}
}

声明一个委托后,我们还是写一个对应的方法,才能给他赋值,这个方法的返回值和参数格式都要和委托一致

using System;namespace ConsoleApp1
{//声明一个委托,无返回值带参数的public delegate void sayHelloDlg(string name);class Program{private static void Main(string[] args){}//委托对应的函数public static void sayHello(string name){Console.WriteLine($"{name},你好呀");}}
}

之后我们可以对其赋值,调用,执行之后控制台会输出(张三,你好呀)

private static void Main(string[] args)
{//委托赋值的方法必须返回值和参数的格式一致//将方法以变量的形式传递,并且以方法的形式执行,多数用于回调函数sayHelloDlg dlg = new sayHelloDlg(sayHello);dlg("张三");Console.ReadKey();
}

除此之外呢,还有委托链,即一个委托可以绑定多个方法

通过+=和-=来操作委托链

或者Delegate.Combine(事件, 新的方法)和Delegate.Remove(事件, 要删除的方法);

private static void Main(string[] args)
{//委托赋值的方法必须返回值和参数的格式一致//将方法以变量的形式传递,并且以方法的形式执行,多数用于回调函数sayHelloDlg dlg = new sayHelloDlg(sayHello);//委托链,可以通过+=和-=来进行多个委托赋值dlg += sayGoodBye;dlg -= sayHello;dlg("张三");Console.ReadKey();
}

除了提前写好方法,我们还可以用匿名函数

private static void Main(string[] args)
{//委托赋值的方法必须返回值和参数的格式一致//将方法以变量的形式传递,并且以方法的形式执行,多数用于回调函数sayHelloDlg dlg = new sayHelloDlg(sayHello);//委托链,可以通过+=和-=来进行多个委托赋值dlg += sayGoodBye;dlg -= sayHello;//匿名函数绑定,这里用的是=,所以前面的所有绑定的方法都清空,只保留这一个匿名函数了dlg = delegate (string name){Console.WriteLine($"{name},我是匿名函数");};//用lamda表达式来帮写匿名函数dlg = (string name) =>{Console.WriteLine($"{name},我是lamda表达式");};dlg("张三");Console.ReadKey();
}

以上就是委托的使用

通过上面代码可以总结出,委托是一种类,引用类型的数据类型。它有返回值类型和参数列表,可以指向一个或多个方法。
当实例化委托后(即创建了一个委托的实例),这个委托类型的实例可以和任何其他方法关联起来,存储这些方法的引用,接着就可以通过委托类型的实例 间接调用这些存储的方法,通过委托我们可以将方法像引用类型一样传递,距离框架的回调函数,都可以通过委托实现

事件

接下来我们看看事件的使用

使用事件之前,还是要先声明个委托

事件是属于类的一个属性,不像委托那样可以声明在命名空间内,给事件赋值也可以使用+=和-=进行多个赋值

namespace ConsoleApp1
{//声明一个委托,无返回值带参数的public delegate void sayHelloDlg(string name);class Program{//声明一个事件public static event sayHelloDlg sayHelloEvent;private static void Main(string[] args){sayHelloEvent += sayHelloPar;if (sayHelloEvent != null)sayHelloEvent("李四");Console.ReadKey();}}
}

通过代码我们可以理解为事件是委托的细分,委托范围大,事件可以将委托细分到分割分类里

委托和事件的区别

尽管事件和委托有许多共同点,但它们在概念上和使用上有一些区别。委托更多地被看作是一种引用方法的机制,而事件则是一种基于委托的通信机制,允许对象发布通知,其他对象可以订阅这些通知。
在实际应用中,事件通常用于实现发布-订阅模式,允许多个对象对同一事件作出响应,而委托则用于定义这些响应的方法。例如,在图形用户界面编程中,按钮点击可以是一个事件,而事件处理程序是一个委托,定义了当按钮被点击时应该执行的方法。
 

委托呢更是一种类型,比如参数传递,类型可以是委托但是不能是事件

事件呢他只能属于类,所以他比较安全,不会像委托那么广泛,更方便独立管理,避免类之外调用

概念和用途:
委托:委托是一种类型安全的引用,用于封装方法。它允许将方法作为参数传递给其他方法,或者存储和调用一组方法。委托允许类似于函数指针的功能,但在C#中更加类型安全和面向对象。
事件:事件是委托的一种特殊应用,用于实现发布-订阅模型。事件提供了一种通知机制,允许对象通知其他对象发生了特定的动作或状态改变。通过事件,一个对象(事件源)可以告知其他对象(事件订阅者)已经发生了某个行为或状态。
使用方式:
委托:委托可以直接通过实例化委托类型并调用其方法来使用,也可以通过 += 和 -= 运算符来添加和移除方法引用。
事件:事件(Event)本质上是委托(Delegate)的一种特殊用法。在C#中,事件通过声明一个委托类型的变量,然后使用 event 关键字来创建。这样做的目的是为了限制对委托调用列表的访问,只允许外部代码订阅(使用 +=)和取消订阅(使用 -=)事件,而不允许直接调用委托或修改调用列表。
安全性和封装:
委托:委托的调用列表可以被外部直接访问和修改,因此需要在使用时谨慎处理以确保类型安全和代码健壮性。
事件:事件封装了委托的调用过程,外部代码不能直接调用或修改事件的触发逻辑,只能通过提供的订阅和取消订阅方法来操作事件。
适用场景:
委托:适合在需要将方法作为参数传递或需要多播委托(即一个委托可以引用多个方法)的场景中使用。
事件:适合实现发布-订阅模式,特别是在GUI编程、多线程编程、异步编程等需要对象之间解耦的情况下。

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

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

相关文章

(一)开发环境搭建以及配置

文章目录 Vmware安装Ubuntu的搭建Ubuntu常规配置换源更新源安装open-vm-tools Samba服务器安装第一步安装第二步 建立共享文件夹第三步配置 Samba 文件 以及 设置Samba用户密码第四步重启 Samba 服务器第五步Windows 和 Ubuntu 如何借助Samba互传 建立虚拟机自带的共享文件夹建…

闲谭Scala(2)--安装与环境配置

1. 概述 Java开发环境安装,需要两步,第一安装JDK,第二配置环境变量。 Scala的话,也是两步,第一安装Scale环境,第二配置环境变量。 需要注意的是,配置环境变量,主要是想让windows操…

MySQL语句学习第二篇_数据库

MySQL语句学习第三篇_数据库 专栏记录MySQL的学习,感谢大家观看。 本章的专栏📚➡️MySQL语法学习 本博客前一章节指向➡️MySQL语句学习第一篇 本人的博客➡️:如烟花般绚烂却又稍纵即逝的主页 目录 MySQL是什么?关于数据库的基础操作MySQL…

基于ArcGIS Pro的SWAT模型在流域水循环、水生态模拟中的应用及案例分析;SWAT模型安装、运行到结果读取全流程指导

目前,流域水资源和水生态问题逐渐成为制约社会经济和环境可持续发展的重要因素。SWAT模型是一种基于物理机制的分布式流域水文与生态模拟模型,能够对流域的水循环过程、污染物迁移等过程进行精细模拟和量化分析。SWAT模型目前广泛应用于流域水文过程研究…

太速科技-519-基于ZU19EG的4路100G光纤的PCIe 加速计算卡

基于ZU19EG的4路100G光纤的PCIe 加速计算卡 一、板卡概述 本板卡系我司自主设计研发,基于Xilinx公司Zynq UltraScale MPSOC系列SOC XCZU19EG-FFVC1760架构,支持PCIE Gen3x16模式。其中,ARM端搭载一组64-bit DDR4,总容量达…

一个C#开发的APP

开发方式 C#Web、AndroidWebView 系统设计 系统主要分两个部分。一个是内容(文章)发布系统,另一个是预约和支付系统。 内容发布系统 和普通的文章发布系统不一样的地方在于,我们把每篇文章和大师关联起来。在文章的下方会显示…

【LLM】Langflow 的简单使用

(PS:爆肝整理,请不要吝啬你的点赞和收藏。) 什么是 Langflow ?Langflow 是一种用于构建多智能体和RAG应用的可视化框架。它提供了个无需编码的 AI 生态系统,能够无缝集成各种常用工具和技术栈。Langflow 以 Python 为基础&#x…

linux自动化批量分发SSH密钥同时批量测试SSH连接教程(包含自动化脚本代码)

1、检查端口 检查分发对象22端口是否打开 nmap -p22 ip地址如果要批量检查端口可以参考我写的这篇文章:linux自动化一键批量检查主机端口 2、命令行分发密钥原理 Linux分发密钥原理主要涉及SSH(Secure Shell)协议,该协议用于…

Ubuntu 下使用命令行将 U 盘格式化为 ext4、FAT32 和 exFAT 的详细教程

Ubuntu 下使用命令行将 U 盘格式化为 ext4、FAT32 和 exFAT 的详细教程 作者:Witheart更新时间:20241228 本教程将详细介绍如何将 U 盘格式化为 ext4、FAT32 和 exFAT 文件系统,同时包括如何安装必要工具(如 exfat-utils&#x…

【漫话机器学习系列】028.CP

Mallows’ Cp:标准化公式解析与应用 Mallows’ Cp 是一种常用的模型选择工具,用于在一系列候选模型中权衡拟合度和复杂性,帮助我们选择性能最优的模型。本文将基于其标准化公式展开详细解析,并探讨其应用场景、实现方法、优点与局…

Python编程技术

设计目的 该项目框架Scrapy可以让我们平时所学的技术整合旨在帮助学习者提高Python编程技能并熟悉基本概念: 1. 学习基本概念:介绍Python的基本概念,如变量、数据类型、条件语句、循环等。 2. 掌握基本编程技巧:教授学生如何使…

论文阅读《Cross-scale multi-instance learning for pathological image diagnosis》

From:2024 MIA CS-MIL GitHub:https://github.com/hrlblab/CS-MIL 一、Abstract: 在数字病理学中,分析高分辨率全幻灯片图像(WSIs)时涉及多个尺度的信息是一个重大挑战。多实例学习(MIL&#x…

短视频平台的视频水印怎么去除?

当你看到某个短视频,觉得内容非常有价值,想要个人收藏以便日后学习或回顾,但发现短视频平台无法直接下载且带有水印时,以下提供的几种方法将帮助你轻松去除水印,获取高清无水印的视频内容。 方法一:使用第…

【Redis】Redis 典型应用 - 缓存 (cache)

目录 1. 什么是缓存 2. 使用 Redis 作为缓存 3. 缓存的更新策略 3.1 定期生成 3.2 实时生成 4. 缓存的淘汰策略 5. 缓存预热, 缓存穿透, 缓存雪崩 和 缓存击穿 关于缓存预热 (Cache preheating) 关于缓存穿透 (Cache penetration) 关于缓存雪崩 (Cache avalanche) 关…

解决springdoc-openapi-ui(Swagger3)跳转默认界面问题

文章目录 问题现象解决方法 问题现象 项目正确引入springdoc-openapi-ui依赖&#xff0c;但是访问/swagger-ui/index.html界面时&#xff0c;跳转到了默认的界面&#xff0c;如下图所示&#xff1a; 解决方法 1、升级maven依赖为1.8.0以上&#xff1a; <dependency>…

绝美的数据处理图-三坐标轴-散点图-堆叠图-数据可视化图

clc clear close all %% 读取数据 load(MyColor.mat) %读取颜色包for iloop 1:25 %提取工作表数据data0(iloop) {readtable(data.xlsx,sheet,iloop)}; end%% 解析数据 countzeros(23,14); for iloop 1:25index(iloop) { cell2mat(table2array(data0{1,iloop}(1,1)))};data(i…

HALCON中用于分类的高斯混合模型create_class_gmm

目录 一、创建用于分类的高斯混合模型函数二、代码和效果展示三、相关函数 一、创建用于分类的高斯混合模型函数 create_class_gmm( : : NumDim, NumClasses, NumCenters, CovarType, Preprocessing, NumComponents, RandSeed : GMMHandle)create_class_gmm创建用于分类的高斯…

lua-debug for Sublime

目标 Sublime 也支持 lua-debug&#xff0c;操作体验与 VSCode 一致。 优势 执行效率高&#xff0c;不掉帧 可随时开启 配置简单&#xff0c;一份配置兼容 VSCode 和 Sublime 安装 要求 Sublime 4 的版本&#xff08;注&#xff1a;从 Sublime 3 升到 4 的不算&#xff0c;…

Kafka消息不丢失与重复消费问题解决方案总结

1. 生产者层面 异步发送与回调处理 异步发送方式&#xff1a;生产者一般使用异步方式发送消息&#xff0c;异步发送有消息和回调接口两个参数。在回调接口的重写方法中&#xff0c;可通过异常参数判断消息发送状态。若消息发送成功&#xff0c;异常参数为null&#xff1b;若发…

leetcode 3312. 查询排序后的最大公约数

题目如下 错误示范: 暴力做法遍历nums数组分别求公约数 using namespace std; int gcd(int a,int b) {int a1 a , b1 b;if(a < b) {a1 b;b1 a;}if(a1 % b1 0) return b1;return gcd(a1 % b1,b1);}//logn vector<int> gcdValues(vector<int>& nums, …