DoNet:浅淡对delegate的理解

article/2025/9/10 8:34:22

1 前言

C#的相关文档,MSDN上其实已经很详细了,关于delegate的使用可以参
考MSDN上的文档https://msdn.microsoft.com/zh-cn/library/900fyy8e.aspx

2 官方示例

委托类型的声明与方法签名相似, 有一个返回值和任意数目任意类型的参数:

public delegate void TestDelegate(string message);
public delegate int TestDelegate(MyType m, long num);

delegate 是一种可用于封装命名或匿名方法的引用类型。 委托类似于 C++ 中的函数指针;但是,委托是类型安全和可靠的。 有关委托的应用,请参见委托和泛型委托。

备注
委托是事件的基础。通过将委托与命名方法或匿名方法关联,可以实例化委托。 有关更多信息,请参见命名方法和匿名方法。必须使用具有兼容返回类型和输入参数的方法或 lambda 表达式实例化委托。 有关方法签名中允许的差异程度的更多信息,请参见委托中的变体(C# 和 Visual Basic)。 为了与匿名方法一起使用,委托和与之关联的代码必须一起声明。 本节讨论这两种实例化委托的方法。

C#示例

// Declare delegate -- defines required signature:
delegate double MathAction(double num);class DelegateTest
{// Regular method that matches signature:static double Double(double input){return input * 2;}static void Main(){// Instantiate delegate with named method:MathAction ma = Double;// Invoke delegate ma:double multByTwo = ma(4.5);Console.WriteLine("multByTwo: {0}", multByTwo);// Instantiate delegate with anonymous method:MathAction ma2 = delegate(double input){return input * input;};double square = ma2(5);Console.WriteLine("square: {0}", square);// Instantiate delegate with lambda expressionMathAction ma3 = s => s * s * s;double cube = ma3(4.375);Console.WriteLine("cube: {0}", cube);}// Output:// multByTwo: 9// square: 25// cube: 83.740234375}

3 个人见解

3.1 C语言函数指针

以下代码简单实现了C语言中的函数指针

#include <iostream>
using namespace std;//this is likely to "delegate"
typedef void(*func)(void);//this is likely to "event"
func event;void CallBack()
{cout << "Callback start running" << endl;   
}int main()
{event= CallBack;event();
}

一、typedef void(*func)(void); 定义了一个返回为void,传入参数为void的函数指针类型,类似于C#中的delegate;
二、func enent; 定义了一个名为event的函数指针变量;
三、主函数中将回调函数CallBack的地址赋值给event这个变量,event();即执行回调函数 CallBack()

运行结果

这里写图片描述

3.2 C#个人示例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace CsharpCallback
{class Program{public delegate void Handler(int i);public event Handler EventRegister;void CallBack(int i){Console.WriteLine("Callback is running " + i);}   void CallTest(int i){Console.WriteLine("Calltest is running " + i);}void RegisetCallback(){EventRegister += new Handler(CallBack);EventRegister += new Handler(CallTest);                 }     static void Main(string[] args){Program test = new Program();test.RegisetCallback();for (int i=0; i<100; i++){if(i == 50){test.EventRegister(i);}}          }}
}

程序分析:
一、 public delegate void Handler(int i); 这里申明了一个名为Handler 委托,当然类似于C中的函数指针,可以参考C代码的示例加以理解,同样的,对于回调函数类型需要和委托相同;
二、public event Handler EventRegister; 这里我理解为定义了一个函数指针的变量(这个理解可能欠妥当),event的具体使用,可以参考官方文档https://msdn.microsoft.com/zh-cn/library/8627sbea.aspx;
三、RegisetCallback() 函数则将回调函数的指针赋值给指针变量。
程序运行结果:
这里写图片描述

4 总结

粗浅的认识了一下C#中的delegate和event的简单用法,并将其与C++中的函数指针做了对比,发现存在相似之处,event的详细使用可以在MSDN上参考官方文档,这方面做的很不错,由于作者水平和能力有限,文中必有错误或者不恰当处,请各位多多指教


http://chatgpt.dhexx.cn/article/BoYBfGEm.shtml

相关文章

DotNetBar

在网上看到一个开源的软件&#xff0c;下载之后发现其界面风格与office 2007类似&#xff0c;看着比较美观。于是下载下来了源代码&#xff0c;进行研究&#xff0c;在代码使用了DotNetBar组件。 简介 DotNetBar组件提供了office 2007风格的用户界面组件&#xff0c;相对于.n…

dotnet命令(不掌握)

安装好.Net Core SDK后就可以使用dotnet命令。 dotnet命令 命令解释dotnet命令本身&#xff0c;可以使用dotnet app.dll运行应用dotnet build生成.NET Core应用程序dotnet clean清理项目生成的输出dotnet new为给定的模板初始化C#或F#项目dotnet pack创建代码的NuGet包dotnet p…

Donate

如果感觉部分文章对你产生了很大的帮助&#xff0c;可以使用下面的支付宝链接进行捐助&#xff1a;You can buy me a coffee:) 可以去https://qr.alipay.com制作自己的支付二维码

细胞实例分割:DoNet: Deep De-overlapping Network for Cytology Instance Segmentation 论文阅读笔记

细胞实例分割&#xff1a;DoNet: Deep De-overlapping Network for Cytology Instance Segmentation 论文阅读笔记 一、Abstract二、引言三、相关工作细胞学实例分割遮挡实例分割 四、方法4.1 预览问题概述工作流程粗糙的 Mask 分割 4.2 解耦合和重组策略双路径区域分割模块 Du…

DotNET框架

1.1 .NET的诞生 DotNET(以下称.NET) 2002年&#xff0c;微软发布了.NET框架的第一个版本&#xff0c;称其实现了下一代系统的目标。.NET框架是一种比MFC和COM编程技术更抑制并面向对象的环境。 具备以下特点&#xff1a; 多平台 行业标准 安全…

donet学习笔记7(数据库的增删改查.dataview的运用)

&#xff11;&#xff0e;数据库前台设计&#xff1a;非常简单&#xff0c;建立一个表即可 create table person( pID varchar ( 10 ) primary key , personName varchar ( 20 ) not null , personSex varchar ( 2 ) ,) &#xff12;&#xff0e;前台设计&#xff1a; …

OpenCV学习笔记:KeyPoint和DMatch数据结构详解

近期事情太多了&#xff0c;课业也繁多&#xff0c;好久没更了&#xff0c;今天对OpenCV中经常用到的一些数据类型的结构进行一波分析&#xff0c;为自己做记录的同时也分享给大家。闲言少叙&#xff0c;开始操作。 一、KeyPoint 数据结构 angle //关键点的方向&#x…

The Center of Attention: Center-Keypoint Grouping via Attention for Multi-Person Pose Estimation

该论文发表于ICCV2021 本文是将Transformer应用于关键点分组的创新工作。实际上是自底向上方法中分组操作的优化&#xff0c;利用Transformer进行关键点分组&#xff0c;达到端到端训练与加快模型推理速度的效果。并且&#xff0c;在拥挤图像中&#xff0c;该方法能够拥有更好…

计算机视觉论文速递(六)GANet: A Keypoint-based Global Association Network for Lane Detection 基于关键点建模的全局关联网络

计算机视觉论文速递&#xff08;六&#xff09;GANet: A Keypoint-based Global Association Network for Lane Detection 基于关键点建模的全局关联网络 1. 摘要2. 方法动机3. 方法介绍3.1 车道线构建-全局关键点关联3.1.1关键点预测3.1.2 偏移量预测3.1.3 起始点采样 3.2 车道…

torchvision使用keypoint rcnn 进行人体关键点定位

系统&#xff1a;Windows 11 pytorch版本&#xff1a;1.11.0 torchvision版本&#xff1a;0.12.0 使用图片地址&#xff1a;vision/person1.jpg at main pytorch/vision GitHub 使用代码&#xff1a; import torch import torchvision.transforms from torchvision.model…

CenterNet: Keypoint Triplets for Object Detection

论文地址&#xff1a;https://arxiv.org/pdf/1904.08189.pdf 在本文中&#xff0c;作者将一个对象建模为一个单点&#xff0c;即其包围框的中心点。并使用关键点估计来找到中心点&#xff0c;并回归到所有其他对象属性&#xff0c;如大小、3D位置、方向&#xff0c;甚至姿势。C…

COCO数据集keypoint部分

COCO数据集总体格式如下&#xff1a; {"info": {...},"licenses": [...],"images": [...],"annotation": [...],"categories": [...], }coco数据集的使用&#xff1a; from pycocotools.coco import COCO import matplotl…

Rethinking Keypoint Representations: Modeling Keypoints and Poses as Objects for Multi-Person Human

该论文发表于ECCV2022 题目&#xff1a;重新思考关键点表征方法&#xff1a;将关键点和人体姿态作为目标建模以进行多人姿态估计 Abstract In keypoint estimation tasks such as human pose estimation,heatmap-based regression is the dominant approach despite possess…

[1] A Keypoint-based Global Association Network for Lane Detection

A Keypoint-based Global Association Network for Lane Detection 0. 摘要 概括车道线检测方法&#xff1a; &#xff08;1&#xff09;基于Anchor定位的方法&#xff0c;自顶向下根据路线图把预设定的Anchor回归到车道线上。缺点是对复杂车道线不够灵活&#xff1b; &#…

cv::KeyPoint中response的介绍

1. Opencv中的KeyPoint类介绍 KeyPoint类的构造函数如下: KeyPoint(); KeyPoint(Point2f _pt, float _size, float _angle-1, float _response0, int _octave0, int _class_id-1); KeyPoint(float x, float y, float _size, float _angle-1, float _response0, int _octave0…

11种Anchor-free目标检测综述 -- Keypoint-based篇

点击上方“3D视觉工坊”&#xff0c;选择“星标” 干货第一时间送达 导读 anchor-free目标检测算法分为两种&#xff0c;一种是DenseBox为代表的Dense Prediction类型&#xff0c;另一种则是以CornerNet为代表的Keypoint-bsaed Detection类型&#xff0c;以检测目标关键点为主…

SMOKE: Single-Stage Monocular 3D Object Detection via Keypoint Estimation

动机&#xff1a; in this paper that predicts a 3D bounding box for each detected object by combining a single keypoint estimate with regressed 3D variables. As a second contribution, we propose a multi-step disentangling approach for constructing the 3D b…

《PCL Docs 案例详解》KeyPoint——SIFT 关键点提取

SIFT 关键点提取 本节演示如何检测点云的SIFT 关键点。SIFT 即尺度不变特征变换&#xff08;Scale-invariant feature transform,SIFT) ,最初用于图像处理领域的一种描述。这种描述具有尺度不变性&#xff0c;可以在图像中检测出关键点&#xff0c;是一种局部特征描述。 完整…

OpenCV中KeyPoint类

https://blog.csdn.net/u010821666/article/details/52883580 Opencv中KeyPoint类中的默认构造函数如下&#xff1a; CV_WRAP KeyPoint() : pt(0,0), size(0), angle(-1), response(0), octave(0), class_id(-1) {} 现分析各项属性 pt(x,y):关键点的点坐标&#xff1b; si…

Anchor-free目标检测综述 -- Keypoint-based篇

早期目标检测研究以anchor-based为主&#xff0c;设定初始anchor&#xff0c;预测anchor的修正值&#xff0c;分为two-stage目标检测与one-stage目标检测&#xff0c;分别以Faster R-CNN和SSD作为代表。后来&#xff0c;有研究者觉得初始anchor的设定对准确率的影响很大&#x…