【编程语言】委托与函数指针
委托与函数指针的相似之处:
- 指向方法:C# 的委托和 C++ 的函数指针都可以用来指向一个方法或函数。
- 调用方法:它们都可以通过引用(委托或函数指针)来调用指向的方法。
委托与函数指针的主要区别:
-
类型安全:
- C++ 函数指针:C++ 的函数指针没有类型安全检查,你可以把一个不匹配的函数地址赋值给一个函数指针变量,这样可能会导致运行时错误。
- C# 委托:C# 的委托是类型安全的。它会确保只能指向与委托签名匹配的方法,这样避免了很多运行时错误。
例如:
delegate int MyDelegate(int a, int b);MyDelegate del = Add; // Add 方法必须符合 MyDelegate 的签名 -
多播委托:
- C++ 函数指针:C++ 中的函数指针通常指向单个函数或方法,如果你想调用多个函数,通常需要使用函数指针数组或者额外的机制来模拟。
- C# 委托:C# 的委托支持多播,即一个委托可以调用多个方法(链式调用)。你可以将多个方法添加到一个委托中,然后依次调用这些方法。
例如:
delegate void MyDelegate(string msg);MyDelegate del = Method1; del += Method2; // 现在委托可以调用 Method1 和 Method2del("Hello"); -
灵活性与支持的特性:
- C++ 函数指针:C++ 的函数指针通常与函数签名紧密关联,且不支持指向类成员函数(除非使用特定的技巧和语法)。
- C# 委托:C# 的委托可以指向静态方法、实例方法、甚至是匿名方法和 lambda 表达式。这使得 C# 的委托更加灵活和强大。
例如:
delegate int MyDelegate(int a, int b);MyDelegate del = (x, y) => x + y; // 使用 lambda 表达式Console.WriteLine(del(3, 4)); // 输出 7 -
事件与委托:
- C++ 函数指针:C++ 中没有内建的事件机制,你需要自己手动管理函数指针的注册和调用。
- C# 委托:C# 中的委托与事件机制紧密结合,使得在 C# 中使用事件(例如 UI 事件、回调函数等)变得非常方便。事件本质上是委托的一种特殊用法。
示例对比:
C++ 中的函数指针:
#include <iostream>int add(int a, int b) {return a + b;
}int subtract(int a, int b) {return a - b;
}int main() {int (*funcPtr)(int, int); // 函数指针声明funcPtr = add; // 将指针指向 add 函数std::cout << funcPtr(5, 3) << std::endl; // 输出 8funcPtr = subtract; // 更改指针指向 subtract 函数std::cout << funcPtr(5, 3) << std::endl; // 输出 2return 0;
}
C# 中的委托:
using System;delegate int MathOperation(int a, int b); // 委托声明class Program {static int Add(int a, int b) {return a + b;}static int Subtract(int a, int b) {return a - b;}static void Main() {MathOperation operation = Add; // 委托指向 Add 方法Console.WriteLine(operation(5, 3)); // 输出 8operation = Subtract; // 委托指向 Subtract 方法Console.WriteLine(operation(5, 3)); // 输出 2}
}
小结:
- 函数指针是 C++ 中的一种底层特性,它可以指向函数,但缺乏类型安全,并且不具备多播等更高级的功能。
- 委托是 C# 中的高级特性,提供了类型安全、多播和更灵活的功能,适用于更广泛的应用场景。
虽然 C# 的委托和 C++ 的函数指针有类似的作用,但委托比函数指针更强大、更安全且更易于使用。
相关文章:
【编程语言】委托与函数指针
委托与函数指针的相似之处: 指向方法:C# 的委托和 C 的函数指针都可以用来指向一个方法或函数。调用方法:它们都可以通过引用(委托或函数指针)来调用指向的方法。 委托与函数指针的主要区别: 类型安全&am…...
基于vue和微信小程序的校园自助打印系统(springboot论文源码调试讲解)
第3章 系统设计 3.1系统功能结构设计 本系统的结构分为管理员和用户、店长。本系统的功能结构图如下图3.1所示: 图3.1系统功能结构图 3.2数据库设计 本系统为小程序类的预约平台,所以对信息的安全和稳定要求非常高。为了解决本问题,采用前端…...
数字后端实现之Innovus中open net原因解析及解决方案
数字IC后端设计实现Innovus中我们经常会碰到如下的WARNING警告信息。这个log是在route或ECO Route阶段报的。这个WARNING必须要看,因为这里是报告当前设计存在open的net,即某些pin只有逻辑连接,而没有实际的物理连接。 这里正常工具应该报ERR…...
MATLAB基础学习相关知识
MATLAB安装参考:抖音-记录美好生活 MATLAB基础知识学习参考:【1小时Matlab速成教程-哔哩哔哩】 https://b23.tv/CnvHtO3 第1部分:变量定义和基本运算 生成矩阵: % 生成矩阵% 直接法% ,表示行 ;表示列 a [1,2,3;4,5,6;7,8,9];%…...
Mac系统下使用Docker快速部署MaxKB:打造本地知识库问答系统
随着大语言模型的广泛应用,知识库问答系统逐渐成为提升工作效率和个人学习的有力工具。MaxKB是一款基于LLM(Large Language Model)大语言模型的知识库问答系统,支持多模型对接、文档上传和自动爬取等功能。本文将详细介绍如何在Ma…...
RT-Thread+STM32L475VET6——icm20608传感器
文章目录 前言一、板载资源二、具体步骤1.打开CubeMX进行配置1.1 使用外部高速时钟,并修改时钟树1.2 打开I2C3,参数默认即可(I2C根据自己需求调整)1.3 打开串口1.4 生成工程 2. 添加icm20608软件包3. 使能传感器,打开动态链接库4.…...
【信息系统项目管理师-案例真题】2022下半年案例分析答案和详解
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 试题一(24分)【问题1】(6分)【问题2】(10分)【问题3】(8分)试题二(26分)【问题1】(8分)【问题2】(8分)【问题3】(4分)【问题4】(6分)试题三(25分)【问题1】(12分)【问题2】(7分)【问题…...
3D机器视觉工业3D图像格式常见的格式
工业3D图像格式主要用于存储和交换三维模型数据,常见的格式包括: STL (Stereolithography) 用途: 3D打印和快速成型。 特点: 存储三角面片信息,文件较小,但不包含颜色和材质数据。STEP (Standard for the Exchange of Product Data) 用途: CAD数据交换。 特点: 支持几何、拓…...
SkyWalking集成Kafka实现日志异步采集经验总结
SkyWalking日志异步采集架构 【重点知识】 1、【Agent】kafka-reporter-plugin-x.x.x.jar包放plugins目录后必走kafka(kafka没有正确配置就会报错) 2、【Agent】异步如不开启数据压缩,日志数据较大,pod多、业务大时容易造成网络…...
Java知识点——IO流
目录 一、IO流基础概念 二、常见的IO流类 三、字符流 1.字符输入流(Reader)与字符输出流(Writer) 2.常用实现类 3.实例 四、字节流 1.字节输入流(InputStream)与字节输出流(OutputStrea…...
uniapp h5端和app端 使用 turn.js
前提:添加页后,添加页与当前页会重叠在一起,不知道为什么,没有找到解决办法 1.h5端 <template><view class"container"><view id"flipbook"><view class"page page1">Page 1</view><view class"page pag…...
使用大语言模型(Deepseek)构建一个基于 SQL 数据的问答系统
GitHub代码仓库 架构 从高层次来看,这些系统的步骤如下: 将问题转换为SQL查询:模型将用户输入转换为SQL查询。 执行SQL查询:执行查询。 回答问题:模型根据查询结果响应用户输入。 样本数据 下载样本数据…...
时间转换(acwing)c/c++/java/python
读取一个整数值,它是工厂中某个事件的持续时间(以秒为单位),请你将其转换为小时:分钟:秒来表示。 输入格式 输入一个整数 NN。 输出格式 输出转换后的时间表示,格式为 hours:minutes:second…...
连接Sql Server时报错无法通过使用安全套接字层加密与 SQL Server 建立安全连接
文章目录 一. 前言二. 解决方案 方案1方案2 三. 总结 一. 前言 在《数据库原理》这门课的实验上,需要使用SQL Server,然后使用jdbc连接sql server突然报错为:SQLServerException: “Encrypt”属性设置为“true”且 “trustServerCertific…...
基于CNN的FashionMNIST数据集识别3——模型验证
源码 import torch import torch.utils.data as Data from torchvision import transforms from torchvision.datasets import FashionMNIST from model import LeNetdef test_data_process():test_data FashionMNIST(root./data,trainFalse,transformtransforms.Compose([tr…...
go channel 的用法和核心原理、使用场景
一、Channel 的核心用法 1. 基本操作 // 创建无缓冲 Channel(同步通信) ch : make(chan int) // 创建有缓冲 Channel(容量为5,异步通信) bufferedCh : make(chan int, 5) // 发送数据到 Channel ch <- 42 // 从…...
pyside6学习专栏(七):自定义QTableWidget的扩展子类QTableWidgetEx
PySide6界面编程中较常用的控件还有QTableWidget表格控件,用来将加载的数据在表格中显示出来,下面继承QTableWidget编写其扩展子类QTableWidgetEx,来实现用单元格来显示除数据文字外,还可以对表格的单元格的文字颜色、背景底色进行设置&#…...
Mybatis常用动态 SQL 相关标签
1. <if> 用于条件判断,当满足条件时执行对应的 SQL 片段。 示例: <select id"findUser" resultType"User">SELECT * FROM usersWHERE 11<if test"name ! null and name ! ">AND name #{name}</if><if…...
AWQ和GPTQ量化的区别
一、前言 本地化部署deepseek时发现,如果是量化版的deepseek,会节约很多的内容,然后一般有两种量化技术,那么这两种量化技术有什么区别呢? 二、量化技术对比 在模型量化领域,AWQ 和 GPTQ 是两种不同的量…...
ESP32S3:解决RWDT无法触发中断问题,二次开发者怎么才能使用内部RTC看门狗中断RWDT呢?
目录 基于ESP32S3:解决RWDT无法触发中断问题引言解决方案1. 查看报错日志2. 分析报错及一步一步找到解决方法3.小结我的源码基于ESP32S3:解决RWDT无法触发中断问题 引言 在嵌入式系统中,RWDT(看门狗定时器)是确保系统稳定性的重要组件。然而,在某些情况下,RWDT可能无法…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...
Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...
【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...
