C# delegate的使用

C# 中的delegate(委托)是一种类型安全的函数指针,它安全地封装了方法的签名和引用。

可以将delegate视为一种可引用的方法类型,类似于C或C++中的函数指针,但比函数指针更安全、更类型安全。

delegate主要用于事件处理、回调方法和异步编程等场景。

委托是一种可以把引用存储为函数的类型。

委托可以引用实例和静态方法,而函数指针只能引用静态方法。

委托的声明非常类似于函数,和函数不同的的是委托不带函数体,并且需要Delegate关键字。

System.Delegate 和“delegate”关键字 - C# | Microsoft Learn

 

定义委托

例如,声明一个接受两个整数并返回它们之和的委托:

public delegate int CalculatorDelegate(int num1, int num2);

实例化委托

定义好委托后,可以创建该委托类型的实例,并将其绑定到符合其签名的方法上:

CalculatorDelegate calculate = AddNumbers; // 假设有一个匹配签名的方法AddNumbers// 定义匹配签名的方法
private int AddNumbers(int num1, int num2)
{return num1 + num2;
}

调用委托

一旦委托被赋值给一个方法,就可以像调用普通方法一样调用它:

int result = calculate(5, 7); // 这会执行AddNumbers方法并返回结果

 

使用Lambda表达式

从C# 3.0开始,你还可以使用Lambda表达式来创建delegate的实例,这使得代码更加简洁。

calculate = (x, y) => x + y;  
result = calculate (5, 3); // result is 8  calculate = (x, y) => x - y;  
result = calculate (5, 3); // result is 2

 

多播委托(组合多个方法)

委托还可以指向多个方法,当调用时,所有关联的方法都会按照添加顺序依次执行:

CalculatorDelegate combined = AddNumbers;
combined += SubtractNumbers;// 调用会先执行AddNumbers,再执行SubtractNumbers
int finalResult = combined(10, 3);

 

泛型委托

C#中预定义了几个常用的泛型委托,如ActionFunc 和 Predicate,简化了常见场景下的委托使用。

  • Action<T>:用于表示没有返回值并且带任意数量输入参数的方法。
  • Func<TResult>:用于表示具有返回值和任意数量输入参数的方法。
  • Predicate<T>:用于表示返回布尔值且仅有一个输入参数的方法。

 

在事件中使用Delegate

delegate在事件处理中特别有用。你可以定义一个delegate类型来表示事件处理程序,然后在类中声明一个该类型的事件。当事件发生时,所有订阅了该事件的处理程序都会被调用。

 

事件(Event)与委托的关系

在C#中,事件是基于委托的实现,用于发布/订阅模型。类通常通过定义一个委托类型来声明事件,然后其他对象可以“订阅”这个事件,即添加处理方法到事件的委托引用列表中。

public event CalculatorDelegate CalculationPerformed;protected virtual void OnCalculationPerformed(int result)
{CalculationPerformed?.Invoke(result, EventArgs.Empty); // 触发事件
}

 

异步编程中的委托

在异步编程中,委托还常用于BeginInvoke/EndInvoke模式或Task类的ContinueWith等方法,以实现非阻塞的异步操作。

以上就是C#中委托的基本使用方式,实际应用中,委托是构建事件驱动程序、回调机制以及实现灵活方法调用的核心工具之一。

 

 

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

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

相关文章

幸福感掉线了?那就去借点“光”吧

做什么事都提不起兴趣&#xff0c;总觉得自己不是很开心但是又难以描述哪里不对劲&#xff0c;遇到想不通的事情总会控制不住地持续内耗自己&#xff1f;当生活不断给你下达负能量挑战时&#xff0c;你是否准备好反击了呢&#xff1f; 这里有一个“借光”故事或许可能帮得上你…

【PyTorch】成功解决TypeError: iteration over a 0-d tensor

【PyTorch】成功解决TypeError: iteration over a 0-d tensor &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您…

【Java IO流】缓冲流和对象流的解析和应用实例

目录 前言 一、缓冲流 四种方式拷贝文件的用时对比 二、对象流 1. 使用对象流写入对象到本地文件 2. 使用对象流读取对象数据 总结 前言 【File文件管理及IO流&#xff08;基本流&#xff09;】http://t.csdnimg.cn/uG5Ff 该篇博客中&#xff0c;介绍了学习高级流需要的…

C++ 函数的默认形参和函数重载

C 函数的默认形参和函数重载 函数的默认形参 在C中&#xff0c;函数的默认形参&#xff08;Default Arguments&#xff09;允许在函数声明或定义时为一个或多个参数指定默认值。这意味着在调用函数时&#xff0c;如果某个参数没有提供值&#xff0c;则自动使用其默认值。这个…

字节跳动后端工程师实习生笔试题-c++

字节跳动后端工程师实习生笔试题链接 笔试题 1. 最大映射2. 木棒拼图3. 魔法权值4. 或与加 1. 最大映射 有 n 个字符串&#xff0c;每个字符串都是由 A-J 的大写字符构成。现在你将每个字符映射为一个 0-9 的数字&#xff0c;不同字符映射为不同的数字。这样每个字符串就可以看…

金航标和萨科微总经理宋仕强说,中国还有一个优势就是有全世界最大的半导体消费市场

金航标和萨科微总经理宋仕强说&#xff0c;中国还有一个优势就是有全世界最大的半导体消费市场&#xff0c;有超过1万亿人民币的规模&#xff0c;全球占比34%&#xff0c;领先美国&#xff08;27%&#xff09;&#xff0c;更大幅领先欧洲和日韩&#xff0c;金航标电子是在的中国…

Vue3 watch侦听器

一 侦听响应式ref 侦听响应式ref常量&#xff0c;当常量的ref的value值发生改变时会触发watch 一个小栗子&#xff1a;当输入框的输入内容变化时下方的文本也会跟着改变 <template><div class"box content"><div class"intro"><el…

【C语言】字符分类函数与字符转换函数

1. 字符分类函数 C语言中有⼀系列的函数是专门做字符分类的&#xff0c;也就是⼀个字符是属于什么类型的字符的。 这些函数的使用都需要包含⼀个头文件是 ctype.h 这些函数的使用方法非常类似&#xff0c;我们就讲解⼀个函数的事情&#xff1a; int islower ( int c ); islow…

Linux 15个常用脚本练习(初级)

&#xff08;1&#xff09;用户猜数字 #!/bin/bash # 脚本生成一个 100 以内的随机数,提示用户猜数字,根据用户的输入,提示用户猜对了, # 猜小了或猜大了,直至用户猜对脚本结束。 # RANDOM 为系统自带的系统变量,值为 0‐32767的随机数 # 使用取余算法将随机数变为 1‐100 的…

js中函数参数的归一化处理

在 JavaScript 中&#xff0c;函数参数的归一化处理是一种将不同类型或格式的参数转换为统一的标准或格式的过程。这样做的目的是为了提高代码的灵活性、可维护性和可重用性。 以下是一些常见的函数参数归一化处理的方式&#xff1a; 数据类型转换&#xff1a;将不同类型的参数…

软考高级,高项和架构哪个更容易?

软考高级共有5个科目&#xff0c;考试难度都是偏大的。相对而言&#xff0c;信息系统项目管理师的考试难度小于系统架构设计师&#xff0c;不过目前高项是1年1考&#xff0c;架构是1年2考&#xff0c;从这个层面来说&#xff0c;通过架构考试的机会要多一些。 架构&高项考…

RabbitMq——direct交换器和fanout交换器 扇形交换器

direct交换器&#xff1a; Configuration 发送 Bean protected Queue queue&#xff08;&#xff09;{ Queue queue new Queue&#xff08;“myQueue”&#xff09; return queue&#xff1b; } amqpTemplate.convertAndSend("myQueue","这是发送的内…

pytorch_fid计算fid

pip install pytorch-fid from pytorch_fid import fid_score# 准备真实数据分布和生成模型的图像数据 real_images_folder xxx generated_images_folder xxx# 计算FID距离值 fid_value fid_score.calculate_fid_given_paths([real_images_folder, generated_images_folder]…

【测试开发】自动化测试 selenium 篇

目录 一. 什么是自动化测试 二. selenium 1. selenium的工作原理 2. seleniumJava的环境搭建(Chrome浏览器) 三. selenium中常用的API 1. 定位元素 findElement 1.1 css选择语法 1.2 xpath 2. 操作测试对象 2.1 sendKeys-在对象上模拟按键输入 2.2 click-点击对象…

mmap访问内存方式

mmap访问内存方式 请看下面的Java代码&#xff0c;这段程序是取自1brc竞赛的第一名的代码。 public static void main(String[] args) throws IOException, InterruptedException {... ...try (var fileChannel FileChannel.open(java.nio.file.Path.of(FILE), java.nio.fil…

elasticsearch8.12 分词器安装

分词器的主要作用将用户输入的一段文本&#xff0c;按照一定逻辑&#xff0c;分析成多个词语的一种工具 分词器下载地址 analysis-ik Releases infinilabs/analysis-ik GitHub 一个简便 安装方式 安装完成之后 会提示重启&#xff0c;重启es即可 ./bin/elasticsearch-pl…

配置LVS NAT模式

配置LVS NAT模式 环境准备 client1&#xff1a;eth0->192.168.88.10&#xff0c;网关192.168.88.5lvs1: eth0 -> 192.168.88.5&#xff1b;eth1->192.168.99.5web1&#xff1a;eth1->192.168.99.100&#xff1b;网关192.168.99.5web2&#xff1a;eth1->192.168…

基于C语言的“贪吃蛇”游戏设计理念

3.功能描述&#xff1a;本游戏主要实现以下几种功能 图1.游戏功能模块 3.1. 贪吃蛇的控制功能&#xff1a;通过各种条件的判断&#xff0c;实现对游戏蛇的左移、右移、下移、上移、自由移动&#xff0c;贪吃蛇的加长功能。 3.2. 游戏显示更新功能&#xff1a;当贪吃蛇左右移动、…

容器只适用于微服务吗?

容器是一种技术&#xff0c;它将应用及其依赖项打包成一个可移植的单元&#xff0c;以便在不同的计算环境中一致地运行。这种技术确实在微服务架构中得到了广泛应用&#xff0c;因为容器可以帮助实现微服务的快速部署、水平扩展和管理。 然而&#xff0c;容器并不仅限于用于微…

操作系统笔记之进程调用API中的getpid、fork、wait、exec补充

操作系统笔记之进程调用API中的getpid、fork、wait、exec补充 code review! —— 杭州 2024-03-17 夜 文章目录 操作系统笔记之进程调用API中的getpid、fork、wait、exec补充1.getpid()2.fork()3.wait()4.exec()5.通常&#xff0c;exec() 调用与 fork() 调用一起使用&#xff…