C# 委托(Delegate)的使用方法及使用场景

C# 委托的使用方法及使用场景

委托(Delegate)是 C# 中的一种类型,表示对方法的引用。通过委托,您可以将方法作为参数传递,或者将多个方法封装在一起进行调用。委托在 C# 中非常重要,广泛应用于事件驱动编程、回调函数、异步编程等场景。

1. 委托的基本概念和语法

委托是 C# 中的一种引用类型,用来定义对具有特定签名的方法的引用。通过委托,您可以像调用方法一样调用被委托引用的方法。

1.1 委托的声明

委托声明类似于方法签名,需要指定返回类型和参数类型。例如,声明一个接受一个字符串参数并返回 void 的委托:

public delegate void MyDelegate(string message);

这表示 MyDelegate 是一个委托类型,它指向的所有方法都必须接受一个字符串类型的参数并返回 void。

1.2 委托的实例化

委托通过 new 关键字来实例化,并将其与某个方法绑定。

// 定义一个与委托签名匹配的方法
public static void DisplayMessage(string message)
{Console.WriteLine(message);
}
public static void Main()
{// 创建委托并将其与 DisplayMessage 方法绑定MyDelegate del = new MyDelegate(DisplayMessage);// 使用委托调用方法del("Hello, Delegates!");
}

2. 委托的使用方法

2.1 调用方法

委托实例化后,您可以通过委托调用绑定的方法。委托可以像调用普通方法一样调用被绑定的方法。

public delegate void MyDelegate(string message);public static void DisplayMessage(string message)
{Console.WriteLine(message);
}public static void Main()
{// 创建委托实例并绑定方法MyDelegate del = new MyDelegate(DisplayMessage);// 通过委托调用方法del("Hello from delegate!");
}

输出:

Hello from delegate!

2.2 多播委托(Multicast Delegates)

委托不仅可以指向单个方法,还可以指向多个方法,这称为多播委托。通过使用 += 可以将多个方法绑定到一个委托,委托在调用时会依次调用所有绑定的方法。

public delegate void MyDelegate(string message);public static void FirstMethod(string message)
{Console.WriteLine("First: " + message);
}public static void SecondMethod(string message)
{Console.WriteLine("Second: " + message);
}public static void Main()
{MyDelegate del = FirstMethod;del += SecondMethod;  // 将 SecondMethod 添加到委托链中// 通过委托依次调用两个方法del("Hello, Multi-cast Delegates!");
}

输出:

First: Hello, Multi-cast Delegates!
Second: Hello, Multi-cast Delegates!

2.3 使用匿名方法

委托也可以用匿名方法来创建,这样就不需要事先声明方法。匿名方法允许您在委托实例化时直接提供实现。

public delegate void MyDelegate(string message);public static void Main()
{// 使用匿名方法创建委托MyDelegate del = delegate (string message){Console.WriteLine(message);};// 调用匿名方法del("Hello, Anonymous Method!");
}

输出:

Hello, Anonymous Method!

2.4 使用 Lambda 表达式

Lambda 表达式是简化匿名方法的语法,使代码更简洁。它常用于委托和 LINQ 查询中。

public delegate void MyDelegate(string message);public static void Main()
{// 使用 lambda 表达式创建委托MyDelegate del = (message) => Console.WriteLine(message);// 调用委托del("Hello, Lambda!");
}

输出:

Hello, Lambda!

2.5 委托作为方法参数

委托最常见的用法之一是作为方法参数传递,使方法能够接受不同的行为。例如,下面的代码通过委托参数实现了自定义的行为:

public delegate void MyDelegate(string message);public static void InvokeDelegate(MyDelegate del)
{del("Hello from method!");
}public static void Main()
{// 创建委托并传递给方法MyDelegate del = (message) => Console.WriteLine(message);InvokeDelegate(del);
}

输出:

Hello from method!

3. 委托的常见使用场景

3.1 回调函数(Callback)

委托可以作为回调函数的实现,允许你在某个操作完成后执行特定的回调方法。这在异步操作、事件处理等场景中非常常见。
例如:

public delegate void CallbackDelegate(string result);public static void DoWorkAsync(CallbackDelegate callback)
{// 模拟异步工作Console.WriteLine("Working...");System.Threading.Thread.Sleep(1000);callback("Work Completed!");
}public static void Main()
{// 传递回调函数DoWorkAsync(result => Console.WriteLine(result));
}

输出:

Working...
Work Completed!

3.2 事件驱动编程

委托常用于 C# 中的事件机制。事件通常是委托的封装,通过委托,您可以实现“发布-订阅”模式,使得对象能够通知其他对象某些操作已经发生。
例如,创建一个按钮点击事件:

public delegate void ButtonClickDelegate();public class Button
{public event ButtonClickDelegate OnClick;public void Click(){OnClick?.Invoke();}
}public static void Main()
{Button button = new Button();// 订阅事件button.OnClick += () => Console.WriteLine("Button clicked!");// 触发事件button.Click();
}

输出:

Button clicked!

3.3 LINQ 查询

委托与 LINQ 查询一起使用时,可以帮助您构建灵活的查询操作。LINQ 允许使用委托来定义筛选、排序、分组等操作。
例如:

public static void Main()
{List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6 };// 使用委托和 LINQ 过滤出偶数var evenNumbers = numbers.Where(n => n % 2 == 0);foreach (var number in evenNumbers){Console.WriteLine(number);}
}

输出:

2
4
6

3.4 异步编程

委托在异步编程中非常有用,特别是在涉及多线程和后台任务时。您可以使用委托实现多线程异步操作,并在操作完成后通过回调函数进行通知。
例如,异步操作通过委托执行:

public delegate void ResultDelegate(string result);public static void PerformAsyncTask(ResultDelegate callback)
{// 模拟异步操作System.Threading.Thread.Sleep(1000);callback("Task Completed!");
}public static void Main()
{// 执行异步任务并传递回调PerformAsyncTask(result => Console.WriteLine(result));
}

输出:

Task Completed!

4. 总结

  1. 委托的声明:委托是 C# 中一种类型,代表对具有相同签名的方法的引用。
  2. 委托的实例化:可以通过 new 关键字实例化委托并将其与方法绑定。
  3. 多播委托:委托可以绑定多个方法,调用时依次执行所有绑定的方法。
  4. 匿名方法与 Lambda 表达式:委托支持匿名方法和 Lambda 表达式,使代码更加简洁。
  5. 常见使用场景:委托广泛应用于回调函数、事件驱动编程、LINQ 查询和异步编程等场景。
    通过委托,C# 提供了一种灵活的方式来处理方法引用,并使得方法调用更加动态和灵活。在实际开发中,委托广泛应用于各种框架和库中,如事件处理、异步操作、UI 控件等。

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

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

相关文章

【面试总结】FFN(前馈神经网络)在Transformer模型中先升维再降维的原因

FFN&#xff08;前馈神经网络&#xff09;在Transformer模型中先升维再降维的设计具有多方面的重要原因&#xff0c;以下是对这些原因的总结&#xff1a; 1.目标与动机 高维映射空间&#xff1a;FFN的设计目的是通过一系列线性变换来拟合一个高维的映射空间&#xff0c;而不仅…

生成模型:生成对抗网络-GAN

1.原理 1.1 博弈关系 1.1.1 对抗训练 GAN的生成原理依赖于生成器和判别器的博弈 生成器试图生成以假乱真的样本。判别器试图区分真假样本。 这种独特的机制使GAN在图像生成、文本生成等领域表现出色。 具有表现为: 生成器 (Generator, G) 生成器的目标是从一个随机噪声&…

MongoDB基本操作

一、实验目的 1. 熟悉MongoDB的基本操作&#xff0c;包括CRUD&#xff08;增加、读取、更新、删除&#xff09;。 2. 理解MongoDB的文档型数据库特性和Shell的使用。 3. 培养学生通过命令行操作数据库的能力。 4. 强化数据库操作的实际应用能力。 二、实验环境准备 1.…

微透镜阵列精准全检,白光干涉3D自动量测方案提效70%

广泛应用的微透镜阵列 微透镜是一种常见的微光学元件&#xff0c;通过设计微透镜&#xff0c;可对入射光进行扩散、光束整形、光线均分、光学聚焦、集成成像等调制&#xff0c;进而实现许多传统光学元器件难以实现的特殊功能。 微透镜阵列&#xff08;Microlens Array&#x…

AIGC视频生成模型:ByteDance的PixelDance模型

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍ByteDance的视频生成模型PixelDance&#xff0c;论文于2023年11月发布&#xff0c;模型上线于2024年9月&#xff0c;同时期上线的模型还有Seaweed&…

【超详细】ELK实现日志采集(日志文件、springboot服务项目)进行实时日志采集上报

本文章介绍&#xff0c;Logstash进行自动采集服务器日志文件&#xff0c;并手把手教你如何在springboot项目中配置logstash进行日志自动上报与日志自定义格式输出给logstash。kibana如何进行配置索引模式&#xff0c;可以在kibana中看到采集到的日志 日志流程 logfile-> l…

从入门到精通:RabbitMQ的深度探索与实战应用

目录 一、RabbitMQ 初相识 二、基础概念速览 &#xff08;一&#xff09;消息队列是什么 &#xff08;二&#xff09;RabbitMQ 核心组件 三、RabbitMQ 基本使用 &#xff08;一&#xff09;安装与环境搭建 &#xff08;二&#xff09;简单示例 &#xff08;三&#xff09;…

[苍穹外卖] 1-项目介绍及环境搭建

项目介绍 定位&#xff1a;专门为餐饮企业&#xff08;餐厅、饭店&#xff09;定制的一款软件产品 功能架构&#xff1a; 管理端 - 外卖商家使用 用户端 - 点餐用户使用 技术栈&#xff1a; 开发环境的搭建 整体结构&#xff1a; 前端环境 前端工程基于 nginx 运行 - Ngi…

USART_串口通讯轮询案例(HAL库实现)

引言 前面讲述的串口通讯案例是使用寄存器方式实现的&#xff0c;有利于深入理解串口通讯底层原理&#xff0c;但其开发效率较低&#xff1b;对此&#xff0c;我们这里再讲基于HAL库实现的串口通讯轮询案例&#xff0c;实现高效开发。当然&#xff0c;本次案例需求仍然和前面寄…

后端面试题分享第一弹(状态码、进程线程、TCPUDP)

后端面试题分享第一弹 1. 如何查看状态码&#xff0c;状态码含义 在Web开发和调试过程中&#xff0c;HTTP状态码是了解请求处理情况的重要工具。 查看状态码的步骤 打开开发者工具&#xff1a; 在大多数浏览器中&#xff0c;您可以通过按下 F12 键或右键单击页面并选择“检查…

Apache Hive3定位表并更改其位置

Apache Hive3表 1、Apache Hive3表概述2、Hive3表存储格式3、Hive3事务表4、Hive3外部表5、定位Hive3表并更改位置6、使用点表示法引用表7、理解CREATE TABLE行为 1、Apache Hive3表概述 Apache Hive3表类型的定义和表类型与ACID属性的关系图使得Hive表变得清晰。表的位置取决于…

OpenEuler学习笔记(九):安装 OpenEuler后配置和优化

安装OpenEuler后&#xff0c;可以从系统基础设置、网络配置、性能优化等方面进行配置和优化&#xff0c;以下是具体内容&#xff1a; 系统基础设置 更新系统&#xff1a;以root用户登录系统后&#xff0c;在终端中执行sudo yum update命令&#xff0c;对系统进行更新&#x…

Vue | 搭建第一个Vue项目(安装node,vue-cli)

一.环境搭建&#xff1a; 1.安装node&#xff1a; 进入网站&#xff0c;下载对应版本的node.js Index of /dist/ (nodejs.org) 我这里下载的是&#xff1a; 解压到对应的目录下&#xff1a; 并新建两个文件夹node_cache和node_global&#xff1a; 2.配置环境&#xff1a; …

日历热力图,月度数据可视化图表(日活跃图、格子图)vue组件

日历热力图&#xff0c;月度数据可视化图表&#xff0c;vue组件 先看效果&#x1f447; 在线体验https://www.guetzjb.cn/calanderViewGraph/ 日历图简单划分为近一年时间&#xff0c;开始时间是 上一年的今天&#xff0c;例如2024/01/01 —— 2025/01/01&#xff0c;跨度刚…

2024年第十五届蓝桥杯青少组国赛(c++)真题—快速分解质因数

快速分解质因数 完整题目和在线测评可点击下方链接前往&#xff1a; 快速分解质因数_C_少儿编程题库学习中心-嗨信奥https://www.hixinao.com/tiku/cpp/show-3781.htmlhttps://www.hixinao.com/tiku/cpp/show-3781.html 若如其他赛事真题可自行前往题库中心查找&#xff0c;题…

[Computer Vision]实验三:图像拼接

目录 一、实验内容 二、实验过程及结果 2.1 单应性变换 2.2 RANSAC算法 三、实验小结 一、实验内容 理解单应性变换中各种变换的原理&#xff08;自由度&#xff09;&#xff0c;并实现图像平移、旋转、仿射变换等操作&#xff0c;输出对应的单应性矩阵。利用RANSAC算法优…

FPGA自分频产生的时钟如何使用?

对于频率比较小的时钟&#xff0c;使用clocking wizard IP往往不能产生&#xff0c;此时就需要我们使用代码进行自分频&#xff0c;自分频产生的时钟首先应该经过BUFG处理&#xff0c;然后还需要进行时钟约束&#xff0c;处理之后才能使用。

【喜讯】海云安荣获“数字安全产业贡献奖”

近日&#xff0c;国内领先的数字化领域独立第三方调研咨询机构数世咨询主办的“2025数字安全市场年度大会”在北京成功举办。在此次大会上&#xff0c;海云安的高敏捷信创白盒产品凭借其在AI大模型技术方面的卓越贡献和突出的技术创新能力&#xff0c;荣获了“数字安全产业贡献…

ceph基本概念,架构,部署(一)

一、分布式存储概述 1.存储分类 存储分为封闭系统的存储和开放系统的存储&#xff0c;而对于开放系统的存储又被分为内置存储和外挂存储。 外挂存储又被细分为直连式存储(DAS)和网络存储(FAS)&#xff0c;而网络存储又被细分网络接入存储(NAS)和存储区域网络(SAN)等。 DAS(D…

Markdown Viewer 浏览器, vscode

使用VS Code插件打造完美的MarkDown编辑器&#xff08;插件安装、插件配置、markdown语法&#xff09;_vscode markdown-CSDN博客 右键 .md 文件&#xff0c;选择打开 方式 &#xff08;安装一些markdown的插件) vscode如何预览markdown文件 | Fromidea GitCode - 全球开发者…