c#委托和事件

目录

委托

1,什么是委托

2,委托的定义

3,使用委托

4,委托的多播

事件

1,什么是事件

2,事件的定义

3,订阅和触发事件

4,事件的访问控制

5,事件的多播


委托

1,什么是委托

委托是一个函数指针,可以存储方法的引用,并且能够在运行时调用这些方法。委托允许将方法作为参数传递,或将方法作为返回值返回

2,委托的定义

例:

// 定义一个委托

public delegate void MyDelegate(string message);

这个委托MyDelegate表示可以接受一个string类型的参数且没有返回值的方法

3,使用委托

定义委托后,可以通过它来引用和调用方法

例:

// 一个普通的方法,符合委托签名
public void DisplayMessage(string message)
{

    Console.WriteLine(message);

}



public void Example()
{

    // 创建委托实例并绑定到方法
    MyDelegate myDelegate = new MyDelegate(DisplayMessage);

    

    // 调用委托,实际上是调用 DisplayMessage 方法
    myDelegate("Hello, Delegate!");

}

输出

Hello,Delegate! 

也可以使用匿名方法或lamba表达式来创建委托

例:

MyDelegate myDelegate = (message) => Console.WriteLine(message);

myDelegate("Hello from Lambda!");

4,委托的多播

委托是可以多播的,即一个委托实例可以同时调用多个方法,可以使用+操作符将多个方法添加到同一个委托实例中

例:

public void AnotherMethod(string message)
{

    Console.WriteLine("Another: " + message);

}



public void ExampleMulticast()
{

    MyDelegate myDelegate = DisplayMessage;

    myDelegate += AnotherMethod;  // 添加方法



    myDelegate("Hello, Multicast!");  // 调用时会依次调用 DisplayMessage 和 AnotherMethod

}

输出

Hello,Multicast!

Another:Hello,Multicast! 

事件

1,什么是事件

事件是基于委托的一个特殊机制,用于实现发布/订阅模式,当某个条件发生时,事件会通知到所有订阅者。事件是对委托的一种封装,提供了更加安全和规范的方式来处理回调

2,事件的定义

事件是委托时高级封装,通常由类或结构体声明并用于通知外部对象发生了某些行为或状态变化

例:

public class MyEventPublisher
{

    // 定义一个委托
    public delegate void MyEventHandler(string message);

    

    // 声明一个事件
    public event MyEventHandler MyEvent;

    

    // 触发事件的方法
    public void TriggerEvent(string message)
    {

        if (MyEvent != null)
        {

            MyEvent(message);  // 调用所有订阅者的方法

        }

    }

}

3,订阅和触发事件

事件必须由外部代码订阅,当事件发生时,发布者会通知所有订阅者

例:

public class MyEventListener
{

    public void OnEventTriggered(string message)
    {

        Console.WriteLine("Event Triggered: " + message);

    }

}



public void ExampleEvent()
{

    MyEventPublisher publisher = new MyEventPublisher();

    MyEventListener listener = new MyEventListener();



    // 订阅事件
    publisher.MyEvent += listener.OnEventTriggered;

    

    // 触发事件
    publisher.TriggerEvent("Hello, Event!");

}

输出

Event Triggered: Hello, Event!

上面的listener的OnEventTriggered方法订阅了事件MyEvent,当MyEvent事件被触发时(也就是调用TriggerEvent方法时),所有被订阅的方法都会收到通知,执行对应操作

4,事件的访问控制

事件通常用Event关键字定义,并且其委托可以被限制为只能添加或删除事件处理程序,外部代码不能直接触发事件,只能通过+=和-=操作符来订阅和退订事件

例:

public event MyEventHandler MyEvent;

public void Example()

{

    // 订阅事件

    MyEvent += DisplayMessage;

    

    // 触发事件的代码由事件的发布者控制

    // 不允许外部代码直接调用 MyEvent();

}

5,事件的多播

类似委托,事件也可以多播,这意味着你可以将多个事件处理程序添加到一个事件上,当事件被触发时,所有订阅的处理程序都会依次调用

例:

public void AnotherHandler(string message)
{

    Console.WriteLine("Another Handler: " + message);

}



public void ExampleMulticastEvent()
{

    MyEventPublisher publisher = new MyEventPublisher();

    

    // 订阅多个处理程序
    publisher.MyEvent += DisplayMessage;

    publisher.MyEvent += AnotherHandler;

    

    // 触发事件时会依次调用两个处理程序
    publisher.TriggerEvent("Multicast Event Triggered!");

}

输出

Event Triggered: Multicast Event Triggered!

Another: Multicast Event Triggered!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

学习笔记|arduino uno r3| RGB 灯珠|Atmega328P|PWM|analogWrite|analogRead函数: RGB灯珠呼吸灯

目录 RGB 灯珠呼吸灯实验RGB 灯珠实验概述工作原理组件清单接线程序代码编译和执行 Tips: Arduino常用的函数解释analogWrite(pin, value)函数analogRead(pin)函数 总结 RGB 灯珠呼吸灯实验 RGB 灯珠实验概述 1-三色LED黑板模块的PCB颜色为黑色,使用5M…

杰发科技——使用ATCLinkTool解除读保护

0. 原因 在jlink供电电压不稳定的情况下,概率性出现读保护问题,量产时候可以通过离线烧录工具避免。代码中开了读保护,但是没有通过can/uart/lin/gpio控制等方式进行关闭,导致无法关闭读保护。杰发所有芯片都可以用本方式解除读保…

ICLR2017 | I-FGSM | 物理世界中的对抗样本

Adversarial Examples in The Physical World 摘要-Abstract引言-Introduction生成对抗图像的方法-Methods of Generating Adversarial Images对抗样本的图片-Photos of Adversarial Examples对抗图像的破坏率-Destruction Rate of Adversarial Images实验设置-Experimental Se…

MySQL(四)MySQL Select语句

1. MySQL Select语句 1.1. 基本查询语句 mysql>select 列名 from 表名;(基本结构查询某一列) mysql>select 列名1,列名2 from 表名;(查询所有列多列) mysql>select * from 表名;(*代表查询所有列) 查询时可以给列设定别名通过as 关键字,别名可以是汉字&a…

高并发写利器-组提交,我的Spring组件实战

高并发写优化理论 对于高并发的读QPS优化手段较多,最经济简单的方式是上缓存。但是对于高并发写TPS该如何提升?业界常用的有分库分表、异步写入等技术手段。但是分库分表对于业务的改造十分巨大,涉及迁移数据的麻烦工作,不会作为…

C++Primer 变量

欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…

【模型】Qwen2-VL 服务端UI

1. 前言 最近在测试VLM模型,发现官方的网页demo,代码中视频与图片分辨率可能由于高并发设置的很小,导致达不到预期效果,于是自己研究了一下,搞了一个简单的前端部署,自己在服务器部署了下UI界面&#xff0…

分布式事务介绍 Seata架构与原理+部署TC服务 示例:黑马商城

1. 什么是分布式事务? 在分布式系统中,如果一个业务需要多个服务合作完成,而且每一个服务都有事务,多个事务必须同时成功或失败,这样的事务就是分布式事务。其中的每个服务的事务就是一个分支事务。整个业务称为全局事务。 打个比…

uni-app:实现普通选择器,时间选择器,日期选择器,多列选择器

效果 选择前效果 1、时间选择器 2、日期选择器 3、普通选择器 4、多列选择器 选择后效果 代码 <template><!-- 时间选择器 --><view class"line"><view classitem1><view classleft>时间</view><view class"right&quo…

C++Primer 基本类型

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

纯前端实现将pdf转为图片(插件pdfjs)

需求来源 预览简历功能在移动端&#xff0c;由于用了一层iframe把这个功能嵌套在了app端&#xff0c;再用一个iframe来预览&#xff0c;只有ios能看到&#xff0c;安卓就不支持&#xff0c;查了很多资料和插件&#xff0c;原理基本上都是用iframe实现的。最终转换思路&#xf…

基于FPGA的出租车里程时间计费器

基于FPGA的出租车里程时间计费器 功能描述一、系统框图二、verilog代码里程增加模块时间增加模块计算价格模块上板视频演示 总结 功能描述 &#xff08;1&#xff09;&#xff1b;里程计费功能&#xff1a;3公里以内起步价8元&#xff0c;超过3公里后每公里2元&#xff0c;其中…

Unix 域协议汇总整理

Unix 域协议是一种用于同一台计算机上进程间通信&#xff08;IPC&#xff09;的技术。它提供了一种比基于网络的套接字更高效的方式来在本地进程中交换数据。Unix 域协议使用文件系统作为通信的媒介&#xff0c;并且只限于在同一台计算机上运行的进程之间进行通信。 Unix 域套接…

JVM学习:CMS和G1收集器浅析

总框架 一、Java自动内存管理基础 1、运行时数据区 运行时数据区可分为线程隔离和线程共享两个维度&#xff0c;垃圾回收主要是针对堆内存进行回收 &#xff08;1&#xff09;线程隔离 程序计数器 虚拟机多线程是通过线程轮流切换、分配处理器执行时间来实现的。为了线程切换…

1.C语言教程:历史、特点、版本与入门示例

目录 1.历史2.特点3.版本4.编译5.Hello World 示例 1.历史 本篇原文为&#xff1a;C语言教程&#xff1a;历史、特点、版本与入门示例。 更多C进阶、rust、python、逆向等等教程&#xff0c;可去此站查看&#xff1a;酷程网 C 语言的诞生源于 Unix 系统的开发需求。 1969 年…

lec7-路由与路由器

lec7-路由与路由器 1. 路由器硬件 路由器的硬件部分&#xff1a; 断电失去&#xff1a; RAM断电不失去&#xff1a;NVRAM&#xff0c; Flash&#xff0c; ROMinterface也算是一部分 路由器是特殊组件的计算机 console 口进行具体的调试 辅助口&#xff08;Auxiliary&…

spring防止重复点击,两种注解实现(AOP)

第一种&#xff1a;EasyLock 简介 为了简化可复用注解&#xff0c;自己实现的注解&#xff0c;代码简单随拿随用 使用方式 1.创建一个注解 Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) Documented public interface EasyLock {long waitTime() default …

Linux-Ubuntu之I2C通信

Linux-Ubuntu之I2C通信 一&#xff0c;I2C通信原理1.写时序2.读时序 二&#xff0c;代码实现三&#xff0c;显示 一&#xff0c;I2C通信原理 使用I2C接口驱动AP3216C传感器&#xff0c;该传感器能实现两个效果&#xff0c;一个是感应光强&#xff0c;另一个是探测物体与传感器…

音视频入门基础:MPEG2-PS专题(4)——FFmpeg源码中,判断某文件是否为PS文件的实现

一、引言 通过FFmpeg命令&#xff1a; ./ffmpeg -i XXX.ps 可以判断出某个文件是否为PS文件&#xff1a; 所以FFmpeg是怎样判断出某个文件是否为PS文件呢&#xff1f;它内部其实是通过mpegps_probe函数来判断的。从《FFmpeg源码&#xff1a;av_probe_input_format3函数和AVI…

框架模块说明 #09 日志模块_01

背景 日志模块是系统的重要组成部分&#xff0c;主要负责记录系统运行状态和定位错误问题的功能。通常&#xff0c;日志分为系统日志、操作日志和安全日志三类。虽然分布式数据平台是当前微服务架构中的重要部分&#xff0c;但本文的重点并不在此&#xff0c;而是聚焦于自定义…