c#笔记(3) 委托回调
委托回调是刚接触c#时最头疼的东西,老看老忘,遂整理一下现在对委托回调的理解。如有错误,请指出,感谢。
委托
C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。委托是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。
回调函数
回调函数就是允许用户把需要调用的方法的指针作为参数传递给一个函数,以便该函数在处理相似事件的时候可以灵活的使用不同的方法。
注意:定义的回调方法签名必须和委托对象一致,这是因为将方法绑定到委托时,编译器会检测他们的兼容性。不符合的话回报编译错误。就比如有一个方法要传入String类型,我们给它传递了一个int类型一样。
委托回调的作用:
调用时,委托可以调用多个方法。 这被称为多播。 若要向委托的方法列表(调用列表)添加其他方法,只需使用加法运算符或加法赋值运算符(“+”或“+=”)添加两个委托。
回调函数可以把调用者与被调用者分开,所以调用者不关心谁是被调用者以及被调用者如何实现。它只需知道存在一个具有特定原型和限制条件的被调用函数。
代码示例:
public static void add(int a,int b)
{
Console.WriteLine(a + b);
}
public static void multiply(int a,int b)
{
Console.WriteLine(a * b);
}
static void Main(string[] args)
{
int x = 1, y = 3;
add(x, y);
multiply(x, y);
Console.ReadLine();
}
委托版:
//申明委托
public delegate void CalculateDelegate(int a, int b);
public static CalculateDelegate calculateDelegate;
//回调函数1
public static void add(int a,int b)
{
Console.WriteLine(a + b);
}
//回调函数2
public static void multiply(int a,int b)
{
Console.WriteLine(a * b);
}
static void Main(string[] args)
{
int x = 1, y = 3;
calculateDelegate = add;//绑定事件
calculateDelegate += multiply;//多播
calculateDelegate(x, y);
Console.ReadLine();
}
项目代码中遇到的委托回调示例
事件发送者的主要工作就是监听,当监听到某一临界条件成立后,将事件告知事件接收者,由事件接收者完成后续动作。
示例1:窗口间传输数据
我做的标注工具,仿labelimg,在子窗口输入label以后,要传回主窗口。我用的是委托(不太清楚有没有其他好的方法)。

(1)事件发布者:子窗口
//申明事件的委托
public delegate void LabelNameDelegate(string labelName);
public LabelNameDelegate labelNameDelegate; //引发事件的函数
private void btnOK_Click(object sender, EventArgs e)
{
...
if (labelNameDelegate != null)
labelNameDelegate(txtLabelName.Text.Trim());
...
}
(2)事件监听者:主窗口
//绑定事件
form.labelNameDelegate = addLabelToList;
//事件发生后的处理程序
private void addLabelToList(string labelName)
{
listboxLabel.Items.Add(labelName);
...
}
示例2:相机获取图像
在实际工作中,较常接触到的例子是相机的委托回调。相机的代码由相机厂商提供,我们只需调用其中的方法,而不用知道它是如何处理数据的。比如相机都会提供开始捕获的委托,该委托会传回图像数据,我们再对图像数据进行处理,比如直接把它显示在picturebox上。我们要写的是对应的得到图像后的处理函数,比如下面的GetImage,其参数和委托参数相同。最重要的是要将事件绑定,即Camera.Acqfun = GetImage。此时,一旦Camera的开始获取图像事件触发,图像就会传到GetImage函数中,并由其处理,显示在picturebox中。
(1)事件发布者:相机
打开相机,会触发camera类的StartAcq(开始获取图像)事件。事件订阅者利用方法GetImage(从图像数据中获取图片)处理事件。
public class Camera
{
//1. 声明事件的委托
public delegate void AcqDelegate(IntPtr imgPtr,int imgHeight,int imgWidth);
//2. 声明事件
public AcqDelegate AcqFun;
//3. 编写引发事件的函数(事件的触发一般在某个函数中)
public override bool StartAcq()
{
...
if(AcqFun!=null)
AcqFun();
...
}
}
事件订阅者
public class xxx
{
//4. 编写事件处理程序
public void GetImage(IntPtr imgdata, int imageHeight, int imageWidth)
{
...
}
public void StartCamera(Camera.AcqDelegate acqfun)
{
//5. 注册事件处理程序
camera.AcqFun = acqfun;
//6. 触发事件
camera.StartAcq();
}
}
触发事件
StartCamera(GetImage);
参考:
https://www.cnblogs.com/jiangshuai52511/p/7600472.html
c#笔记(3) 委托回调的更多相关文章
- 【转】第5篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:自动注册JS脚本+委托回调方法分析
作者: 牛A与牛C之间 时间: 2013-11-19 分类: 技术文章 | 暂无评论 | 编辑文章 主页 » 技术文章 » 第5篇:Xilium CefGlue 关于 CLR Object 与 JS ...
- 【转】第4篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:委托回调方法分析
作者: 牛A与牛C之间 时间: 2013-11-18 分类: 技术文章 | 暂无评论 | 编辑文章 主页 » 技术文章 » 第4篇:Xilium CefGlue 关于 CLR Object 与 JS ...
- 对“demo!demo.Index+HookProc::Invoke”垃圾收集的类型已委托回调。这可能会导致应用程序崩溃、损坏和数据丢失。当传递委托给非托管代码,托管应用程序必须让这些委托保持活着
对"demo!demo.Index+HookProc::Invoke"垃圾收集的类型已委托回调.这可能会导致应用程序崩溃.损坏和数据丢失.当传递委托给非托管代码,托管应用程序必须承 ...
- 6.26学习 异步委托回调函数 VS 多线程 VS 并行处理
描述: 我现在是轮询着构建实例,然后这个实例去执行一个方法,但是执行方法需要大约10s时间,全部轮询下来需要很长时间.所以我现在要更改,头给了我两个方法,1多线程 2异步委托回调函数. 异步委托回调函 ...
- MOOS学习笔记2——HelloWorld回调
MOOS学习笔记2--HelloWorld回调 例程 #include "MOOS/libMOOS/Comms/MOOSAsyncCommClient.h" bool OnConn ...
- C#跨窗体调用控件(委托回调函数使用例子)
问题: 有两个窗体,FORM1(含一个label控件,一个名为显示form2的button控件)和FORM2(含一个button控件).启动时,FORM1中点击button控件显示form2使FORM ...
- C#委托+回调详解
今天写不完,明天会接着写的,,,, 学习C#有一段时间了,不过C#的委托+回调才这两天才会用,以前只是知道怎么用.前面的一篇文章,函数指针,其实是为这个做铺垫的,说白了委托就相当于C语言中的函数指针, ...
- [Clr via C#读书笔记]Cp17委托
Cp17委托 简单介绍 delegate回调函数机制,可以理解存储函数地址的变量类型: 类型安全: 引用类型支持逆变和协变: 回调 静态方法,实例方法 委托的本质 所有的委托都派生自System.Mu ...
- jQuery笔记之 Ajax回调地狱
本次演示回调地狱: 模拟电影网站,判断用户是否为该网址的vip用户(最高权限为vip) 如果vpi就展示出vip电影,点击相应的电影显示出该电影的详细介绍 ---------------------- ...
- C# 异步委托回调函数使用
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...
随机推荐
- 面向切面编程AOP[二](java @EnableAspectJAutoProxy 代码原理)
前言 @EnableAspectJAutoProxy 是启动aop功能的意思,那么里面是什么呢? 正文 @Target({ElementType.TYPE}) @Retention(Retention ...
- 论文记载:A Survey on Traffic Signal Control Methods
ABSTRACT 交通信号控制是一个重要且具有挑战性的现实问题,其目标是通过协调车辆在道路交叉口的移动来最小化车辆的行驶时间.目前使用的交通信号控制系统仍然严重依赖过于简单的信息和基于规则的方法,尽管 ...
- 安装以及破解Navicat
1.下载Navicat软件安装包 链接:https://pan.baidu.com/s/1RltCPjg1mmpOjC7vxAjQ4g 提取码:v4k8 2.下载好文件打开是这样的,先运行 " ...
- SQL Server实战一:创建、分离、附加、删除、备份数据库
本文介绍基于Microsoft SQL Server软件,实现数据库创建.分离.附加.删除与备份的方法. 目录 1 交互式创建数据库 2 Transact-SQL指定参数创建数据库 3 交互式分离 ...
- 15M安装包就能玩《原神》,带你了解云游戏背后的技术秘密
简介:对于大多数玩家来说,云游戏已经不是一个陌生的概念,它经常和秒玩.不吃设备.大屏临场感.上手门槛低.真香等字眼一起出现在评论留言区.的确,对于既想尝试高品质游戏大作又不想一直卷装备的玩家来说,云游 ...
- 日志服务SLS 助力识货 APP,解决业务数据采集查询监控问题
简介: 日志服务SLS 助力识货 APP,解决业务数据采集查询监控问题 更多存储标杆案例欢迎点击下方链接查看 阿里云存储标杆案例样板间 公司介绍识货APP是虎扑体育旗下的导购应用,致力于为广大年轻用户 ...
- Apache Hudi 在 B 站构建实时数据湖的实践
简介: B 站选择 Flink + Hudi 的数据湖技术方案,以及针对其做出的优化. 本文作者喻兆靖,介绍了为什么 B 站选择 Flink + Hudi 的数据湖技术方案,以及针对其做出的优化.主 ...
- [DApp] ethers.js VS Moralis
ether.js 是 Web3 封装的 js 库,特别适合以太坊平台. Moralis 不仅是 Web3 的封装,还是一体化解决方案,包括服务端部署方案和适配各种链,使用范围更广. 在选择上,主要还是 ...
- [FAQ] jsoneditor 如何切换 mode 或者选择 modes
1. 用于切换编辑器模式:text.tree.code JSONEditor.setMode(mode) 2. 让 mode 变成可以选择的: const options = { modes: ['t ...
- Photoshop AI 令人惊叹的生成式填充
原文地址:Adobe Photoshop's Amazing New Generative Fill | by Paul DelSignore | The Generat | May, 2023 | ...