54、C# 委托 (Delegate)

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

基本概念

委托声明

csharp 复制代码
// 声明一个委托类型
public delegate void MyDelegate(string message);

委托实例化与使用

csharp 复制代码
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 - 无返回值的方法

csharp 复制代码
Action<string> action = Console.WriteLine;
action("Using Action delegate");

2.Func - 有返回值的方法

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

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

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

匿名方法和 Lambda 表达式

匿名方法

csharp 复制代码
MyDelegate del = delegate(string msg) 
{
    Console.WriteLine("Anonymous: " + msg);
};
del("Hello");

Lambda 表达式

csharp 复制代码
MyDelegate del = msg => Console.WriteLine("Lambda: " + msg);
del("Hello");

多播委托

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

csharp 复制代码
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

异步委托

委托可以异步调用:

csharp 复制代码
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# 高级特性至关重要。

相关推荐
Hello.Reader5 分钟前
Three.js / Cesium 卡顿怎么办?把三维渲染搬到 GPU 服务器
服务器·开发语言·javascript
Solange__12 分钟前
AI世界模型、3D场景生成和游戏引擎怎么选?按5类任务比较交互、物理与导出
开发语言·人工智能·游戏·平面·3d·自然语言处理·游戏引擎
椒颜皮皮虾྅19 分钟前
模型部署不再卡在环境上:DeploySharp 四大推理引擎与 Windows/Linux 离线交付实战
linux·运维·开发语言·人工智能·windows·计算机视觉·cuda
codebolt31 分钟前
C++程序crash分析和内存检测
开发语言·c++
椒颜皮皮虾྅32 分钟前
让 C# 读懂整张图:DeploySharp 驱动 PaddleOCR v4/v5/v6,打通 OCR 全流程
开发语言·人工智能·深度学习·学习·c#·ocr·cuda
昂好的day35 分钟前
C# 同步异步与多线程:Thread / Task / 线程池一次讲透(上篇)
开发语言·windows·c#
Java后端的Ai之路37 分钟前
01、Java并发编程:学习攻略如何才能学好并发编程?
java·开发语言·学习
OxYGC1 小时前
[工程] PHP2Shell 漏洞解析:两条 PHP 内核 RCE,为什么应用层的防护全部失效
android·开发语言·php
小徐不徐说1 小时前
数据库存储基础:理解表结构、主键、事务与 BLOB
开发语言·数据库·c++·qt·程序设计
草莓熊Lotso2 小时前
【C++ 基于微服务的即时通讯系统】网关基建:cpp-httplib 与 WebSocketpp 从入门到实战
linux·开发语言·数据库·c++·redis·微服务·云原生