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…

linux环境变量配置文件区别 /etc/profile和~/.bash_profile

在 Linux 系统中&#xff0c;环境变量可以定义用户会话的行为&#xff0c;而这些变量的加载和配置通常涉及多个文件&#xff0c;如 ~/.bash_profile 和 /etc/profile。这些文件的作用和加载时机各有不同。以下是对它们的详细区别和用途的说明&#xff1a; 文章目录 1. 环境变量…

理解 Rust 的所有权:内存管理的独特之道

一、什么是所有权&#xff1f; 所有权是一种内存管理方式&#xff0c;它通过一套规则确保程序在运行时不会出现内存泄漏或其他内存问题。在不同编程语言中&#xff0c;内存管理通常有以下几种方式&#xff1a; 垃圾回收&#xff08;Garbage Collection, GC&#xff09;&#…

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

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

Windows 通过 openssh 连接 Ubuntu 24.04 LTS

Ubuntu 24.04 LTS Ubuntu 配置 sudo apt update sudo apt install openssh-server sudo systemctl start ssh sudo systemctl enable ssh sudo systemctl status ssh sudo ufw status sudo ufw allow ssh sudo ufw reload sudo ufw status安装 OpenSSH 服务器 首先&#xff…

【超详细】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…

Docker使用 使用Dockerfile来创建镜像

本篇文章主要介绍了Docker使用Dockerfile来创建镜像&#xff0c; 本文学习Dcokerfile的基本命令,并且创建一个支持ssh服务的镜像. 1.Dockerfile 1.1基本案例 基本案例 dockerfile可以说是docker的描述符,该文件定义了docker镜像的所能拥有哪些东西.基本格式如下: 第一行指定…

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

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

IJK播放器问题集

IJK播放器问题集 在使用ijkplayer进行播放时候&#xff0c;时常会遇到一些问题&#xff0c;故记录下&#xff1a; 1 ijkplayer出现小窗切换到大窗画面卡住问题 检查是否大小窗口切换时候&#xff0c;频繁设置了surface。某些底层api频繁设置会导致画面不动。 //holder判断是…

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

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

“推理”(Inference)在深度学习和机器学习的语境

“推理”&#xff08;Inference&#xff09;在深度学习和机器学习的语境中&#xff0c;是指使用经过训练的模型对新数据进行预测的过程。将其简单地理解为“模型的应用阶段”。在这一阶段&#xff0c;我们不再进行模型训练&#xff0c;而是利用已训练好且保存下来的模型来获取对…

简识JVM栈帧中的操作数栈

在JVM&#xff08;Java虚拟机&#xff09;中&#xff0c;栈帧&#xff08;Stack Frame&#xff09;是方法执行时的数据结构&#xff0c;用于存储局部变量、操作数栈、方法返回地址等信息。 其中&#xff0c;操作数栈&#xff08;Operand Stack&#xff09;是栈帧中的一个重要组…

我国的金融组织体系,还有各大金融机构的分类,金融行业的组织

中国金融组织体系介绍 中国金融组织体系是一个复杂而多层次的系统&#xff0c;涵盖了各种类型的金融机构和监管机构。以下是关于中国金融组织体系的详细介绍&#xff0c;包括一行三会等金融监管机构&#xff0c;各大金融机构的分类、涉及的银行以及行业组织。 &#xff08;一…

OpenCV相机标定与3D重建(66)对立体匹配生成的视差图(disparity map)进行验证的函数validateDisparity()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 使用左右检查来验证视差。矩阵 “cost” 应该由立体对应算法计算。 cv::validateDisparity 函数是 OpenCV 库中用于对立体匹配生成的视差图&…

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表变得清晰。表的位置取决于…