C# 系统学习(事件与委托 )

在C#中,事件是一种特殊的委托类型,用于通知其他类有某件事发生。事件允许一个类公开某些特定的行为,而订阅者可以在这些行为发生时收到通知。委托则是类型安全的函数指针,可以指向具有匹配签名的方法。

C# 中的事件声明与订阅

  1. 事件声明: 在类中声明一个事件,通常使用 event 关键字和一个委托类型:
    public delegate void ItemChangedEventHandler(object sender, EventArgs e); // 定义一个委托类型public class Inventory
    {public event ItemChangedEventHandler ItemAdded; // 声明一个事件public void AddItem(Item item){// ... 实现添加物品逻辑...OnItemAdded(this, EventArgs.Empty); // 触发事件}protected virtual void OnItemAdded(object sender, EventArgs e){ItemAdded?.Invoke(sender, e); // 安全地调用所有订阅者}
    }
  2. 事件订阅: 其他类可以通过+=操作符订阅事件:
    public class Player
    {private Inventory inventory;public Player(Inventory inv){inventory = inv;inventory.ItemAdded += OnInventoryItemAdded; // 订阅事件}private void OnInventoryItemAdded(object sender, EventArgs e){Debug.Log("Player received notification that an item was added to the inventory.");}
    }

委托定义与实例化

  • 委托定义: 一个委托类型定义了一种方法签名,任何与该签名匹配的方法都可以赋值给该委托类型的实例。
    public delegate int Operation(int x, int y); // 定义一个简单的加减乘除运算委托
  • 委托实例化: 可以通过实例化一个委托并将一个符合签名的方法作为参数传入来创建委托实例。
    class MathOperations
    {public static int Add(int a, int b) => a + b;public static int Subtract(int a, int b) => a - b;public Operation AddOperation => new Operation(MathOperations.Add);public Operation SubtractOperation => new Operation(MathOperations.Subtract);
    }

Action 和 Func 委托

  • Action 委托: Action 是一种无返回值的委托,可以接收0到16个参数。例如,Action<int, string> 表示一个不返回值,接受一个整数和一个字符串参数的方法。
    Action<string> printMessage = Console.WriteLine; // 实例化一个Action委托printMessage("Hello, World!"); // 调用委托
  • Func 委托: Func 是一种带返回值的委托,同样可以接收0到16个参数,最后一个类型参数是返回值类型。例如,Func<int, string, bool> 表示一个接受一个整数和一个字符串参数,返回一个布尔值的方法。
    Func<int, int, int> addNumbers = (x, y) => x + y; // 实例化一个Func委托int result = addNumbers(3, 5); // 调用委托,返回结果8

总结

通过事件和委托,C#提供了强大的回调机制,使得程序更加灵活,易于模块化。事件主要用于跨类间的通信,而委托则更广泛地应用于需要传递和执行方法的场合,Action和Func委托作为预定义的泛型委托类型,极大地方便了日常开发中的使用。

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

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

相关文章

再生式收音机填坑记

年前踩坑再生式收音机&#xff0c;还是得找机会把坑填上&#xff0c;最终选定了K8TND的方案&#xff0c;其实与Mr. Kitchen的也基本差不多。电路图如下&#xff1a; 实物图如下&#xff1a; 实际接收效果还不错&#xff0c;但是感觉频段上哪哪都是中国之声&#xff0c;对这种…

CSMM软件能力成熟度是什么?一文读懂!

01、CSMM是什么&#xff1f; CSMM是标准T/CESA 1159-2022《软件过程能力成熟度模型》&#xff08;Software capability maturity model&#xff09;的英文简称&#xff0c;是我国基于国家安全和信息安全背景下&#xff0c;在软件过程管理领域对标CMMI的标准&#xff0c;旨在替…

UE4_碰撞_碰撞蓝图节点——Line Trace For Objects(对象的线条检测)

一、Line Trace For Objects&#xff08;对象的线条检测&#xff09;&#xff1a;沿给定线条执行碰撞检测并返回遭遇的首个命中&#xff0c;这只会找到由Object types指定类型的对象。注意他与Line Trace By Channel(由通道检测线条&#xff09;的区别&#xff0c;一个通过Obje…

React系列之合成事件与事件处理机制

文章目录 React事件处理机制原生事件的事件机制事件代理&#xff08;事件委托&#xff09; 合成事件使用合成事件目的合成事件原生事件区别事件池 原生事件和React事件的执行顺序e.stopPropagation() React17事件机制的修改 React事件处理机制 react 事件机制基本理解&#xf…

时序预测 | Matlab实现CPO-BP冠豪猪算法优化BP神经网络时间序列预测

时序预测 | Matlab实现CPO-BP冠豪猪算法优化BP神经网络时间序列预测 目录 时序预测 | Matlab实现CPO-BP冠豪猪算法优化BP神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现CPO-BP冠豪猪算法优化BP神经网络时间序列预测&#xff08;完整源码…

Linux(CentOS7)安装软件方式(编译安装,yum,rpm)

目录 前言 安装方式 编译安装 下载 解压 安装 创建软链接 yum rpm 前言 在使用 CentOS 安装软件时&#xff0c;发现安装的方式有好几种&#xff0c;有官网下载 tar 包解压&#xff0c;然后自己编译安装的&#xff0c;也有直接通过 yum 命令一键安装的&#xff0c;还有…

力扣刷题Days29-第二题-70.爬楼梯(js)

只有学习&#xff0c;没有自己的思路解题哈哈哈 1&#xff0c;题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 2&#xff0c;代码 这种解法的本质是斐波那契数列 /*** param {number} n* re…

appium辅助自动化工具-- Appium studio

这里我要给大家介绍一款appium辅助自动化测试工具appium studio&#xff0c;你没看错&#xff0c;不是android studio&#xff0c;也不是appium android studio&#xff0c;就是appium studio&#xff01; 下载地址&#xff1a; Appium Studio | Digital.ai Continuous Test…

探究ThreadLocal的魔数0x61c88647和Entry数组

探究ThreadLocal 下面有一个很重要的HASH_INCREMENT,他的值是0x61c88647 public class ThreadLocal<T> {/***ThreadLocals依赖于附加到每个线程的每线程线性探针哈希映射 (thread.threadLocals和inheritableThreadLocals)。ThreadLocal对象充当键&#xff0c;通过threa…

Visual Studio 2022 中VLD库如何安装

GitHub链接 Release v2.5.1 KindDragon/vld 点击可执行程序进行下载 点击可执行程序进行安装 双击打开 一直点击next即可完成安装&#xff08;不用在意安装路径&#xff0c;总共不到2MB&#xff09; 如果GitHub无法打开&#xff0c;可以私信我发你安装包直接安装

MyBatis的高级特性探索

MyBatis 是一个流行的Java持久层框架&#xff0c;它提供了简单和直观的方法来处理数据库操作。相比于传统的JDBC操作&#xff0c;MyBatis通过XML或注解方式映射Java对象与数据库之间的关系&#xff0c;极大地简化了数据库编程工作。除了基本的数据映射和SQL语句执行功能&#x…

VBA批量读取txt文档目标数据并分组处理

VBA在批量处理txt等文本文件的数据是其数据处理的一大重要应用&#xff0c;实际在处理txt文档往往需要提取多个测试料的多个目标数值&#xff0c;而且还要将提取的数值进一步处理&#xff0c;如求取平均值&#xff0c;最小值等&#xff0c;能够直观地看到一组数据的规律&#x…

Java学习笔记NO.27

Java异常 异常处理在Java编程中是一项至关重要的技术&#xff0c;它有助于增强程序的稳定性和可靠性。 1.为什么需要处理异常&#xff1f; 在编写Java程序时&#xff0c;我们无法保证代码的100%正确性&#xff0c;因为各种意外情况可能会导致程序出现错误。这些意外情况包括但…

二维码门楼牌管理应用平台建设:实现民主参与的新途径

文章目录 前言一、二维码门楼牌管理应用平台的兴起二、投票表决功能的实现三、居民参与度的提升四、面临的挑战与前景展望 前言 在数字化时代&#xff0c;二维码技术的应用已经渗透到我们生活的方方面面。近期&#xff0c;二维码门楼牌管理应用平台的建设成为了社区治理的一大…

学习嵌入式系统开发学习课程有哪些

学习嵌入式系统开发需要掌握一些基础的编程知识和硬件知识&#xff0c;以下是一些常见的嵌入式系统开发学习课程和资源&#xff1a; 1. **C/C编程课程**&#xff1a;掌握好C/C编程语言是嵌入式系统开发的基础&#xff0c;可以通过在线教育平台如Coursera、Udemy、edX等搜索相关…

[flask]请求全局钩子

flask从入门到精通之钩子、异常、context、jinjia模板、过滤器 - 异步非阻塞 - 博客园 (cnblogs.com) 参考的这个博客&#xff0c;但有一个需要注意的是&#xff0c;最新版本的flask不知道是不是更新了还是怎么了&#xff0c;他的before_first_request不见了&#xff0c;如果继…

Vue2源码 —— 数据响应式实现

Vue2源码 —— 数据响应式实现 配置项 //package.json {"name": "vue","version": "1.0.0","main": "index.js","scripts": {"dev": "rollup -cw"},"author": "&…

Linux非root用户安装mysql5.7

1、下载安装包MySQL :: Download MySQL Community Server 点击Archives 我下载的是5.7.27版本&#xff0c;linux主机直接选择linux-Generic即可&#xff0c;选择第一个包下载即可 2、安装mysql 解压 shell> tar xzvf mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz shell&g…

VUE2实现元素抖动的指令

指令代码 要实现Vue2的指令&#xff0c;可以按照以下步骤进行&#xff1a; 创建一个指令对象。 export default {inserted: (el, binding) > {// 触发抖动效果if (!binding.value) return el.classList.remove(shake-animation)el.classList.add(shake-animation)const a…

抽象类和接口的简单认识

目录 一、抽象类 1.什么是抽象类 2.抽象类的注意事项 3.抽象类与普通类的对比 二、接口 1.接口的简单使用 2.接口的特性 3.接口的使用案例 4.接口和抽象类的异同 一、抽象类 所谓抽象类&#xff0c;就是更加抽象的类&#xff0c;也就是说&#xff0c;这个类不能具体描…