当前位置: 首页 > news >正文

54、C# 委托 (Delegate)

委托是 C# 中的一种类型安全的函数指针,它允许将方法作为参数传递,或者将方法存储在变量中。委托是事件、异步编程和 LINQ 等功能的基础。

基本概念

委托声明

// 声明一个委托类型
public delegate void MyDelegate(string message);

委托实例化与使用

public class DelegateExample
{public static void Main(){// 实例化委托MyDelegate del = new MyDelegate(ShowMessage);// 调用委托del("Hello, Delegate!");// 多播委托(组合委托)del += AnotherMessage;del("Now it's multicast!");}public static void ShowMessage(string message){Console.WriteLine(message);}public static void AnotherMessage(string message){Console.WriteLine("Another: " + message);}
}

内置委托类型

C# 提供了几种内置的通用委托类型,无需自定义:

1.Action - 无返回值的方法

Action<string> action = Console.WriteLine;
action("Using Action delegate");

2.Func - 有返回值的方法

Func<int, int, int> add = (a, b) => a + b;
int result = add(5, 3); // 结果为8

3.Predicate - 返回bool的方法(通常用于过滤)

Predicate<string> isLong = s => s.Length > 5;
bool longEnough = isLong("Delegate"); // 返回true

匿名方法和 Lambda 表达式

匿名方法

MyDelegate del = delegate(string msg) 
{Console.WriteLine("Anonymous: " + msg);
};
del("Hello");

Lambda 表达式

MyDelegate del = msg => Console.WriteLine("Lambda: " + msg);
del("Hello");

多播委托

委托可以组合多个方法,按顺序调用:

Action<string> multiCast = Console.WriteLine;
multiCast += s => Console.WriteLine("Second: " + s);
multiCast += s => Console.WriteLine("Third: " + s);multiCast("Multicast Message");
// 输出:
// Multicast Message
// Second: Multicast Message
// Third: Multicast Message

异步委托

委托可以异步调用:

public class AsyncDelegateExample
{public static void Main(){Func<int, int, int> add = (a, b) => {Thread.Sleep(1000); // 模拟耗时操作return a + b;};// 异步调用IAsyncResult result = add.BeginInvoke(5, 3, null);Console.WriteLine("Doing other work...");// 获取结果int sum = add.EndInvoke(result);Console.WriteLine($"Result: {sum}");}
}

实际应用场景

1.事件处理:委托是 C# 事件系统的基础
2.LINQ:LINQ 查询大量使用 Func 和 Action 委托
3.异步编程:BeginInvoke/EndInvoke 模式
4.回调机制:将方法作为参数传递

注意事项

1.委托是引用类型
2.多播委托按添加顺序执行
3.可以使用 Delegate.Combine 和 Delegate.Remove 手动管理委托链
4.在多线程环境中使用委托时要注意线程安全问题

委托是 C# 中实现回调、事件和函数式编程风格的重要工具,理解委托对于掌握 C# 高级特性至关重要。

在这里插入图片描述

http://www.xdnf.cn/news/698761.html

相关文章:

  • Maven 项目中集成数据库文档生成工具
  • leetcode hot100刷题日记——23.数组中的第K个最大元素
  • 磁光电流互感器行业2025数据分析报告
  • UE5 编辑器工具蓝图
  • 2025年AEJ SCI2区,动态反向排序教与学优化算法DSTLBO+光伏系统参数辨识,深度解析+性能实测
  • java课堂笔记10
  • ubuntu创建指定版本python虚拟环境
  • emu8086 v4.08安装教程
  • Python基础语法(下)
  • 打破认知壁垒重构科技驱动美好生活 大模型义务传播计划
  • 数据科学入门
  • CS144 - Lecture 1 记录
  • js中common.js和ECMAScript.js区别
  • 智慧交通新纪元:AI赋能下的交通治理革命与技术演进路径
  • 学习路之Nginx--不同域名的反向代理
  • 有道翻译js分析
  • 对于Const关键字修饰的对象
  • 明远智睿SSD2351开发板:语音机器人领域的变革力量
  • 麻省理工新突破:家庭场景下机器人实现精准控制,real-to-sim-to-real学习助力
  • Conda更换镜像源教程:加速Python包下载
  • C++基础:模拟实现vector(有存在深层次的浅拷贝问题)
  • 【芯片设计- SoC 常用模块 9.1 -- PLL 介绍】
  • 本周白银想法
  • 《数据结构笔记六》队列 ⭐⭐⭐
  • Dolphin文档解析从理论到实践——保姆级教程
  • 【MySQL】第12节|MySQL 8.0 主从复制原理分析与实战(二)
  • VisionPro —— 上料检测模拟
  • AVL树
  • Kotlin扩展函数与属性实战指南:从入门到企业级应用
  • 【c++】【数据结构】红黑树