C# 委托详解

本文介绍了C#中的委托概念,它是一种后期绑定机制,类似于C++的函数指针。文章详细讲解了如何声明和实例化委托,以及如何通过调用委托执行存储的方法。委托可用于实现回调函数,提高代码复用性和降低耦合度,还支持多播,即一个委托可以调用多个方法。示例代码展示了委托的声明、实例化、调用以及多播的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.委托的概念

C#中委托也叫代理,委托提供了后期绑定机制(官方解释),功能类似于C++中的函数指针,它存储的就是一系列具有相同签名和返回类型的方法的地址,调用委托的时候,它所包含的所有方法都会被执行。

二.委托的用法

1.声明委托

语法:修饰符 delegate <函数返回类型> <委托名> (<函数参数>)

2.类似于创建对象,委托实例化,将实例化一样签名的函数名作为参数传进"构造函数"

3.调用委托

a.像调用函数一样调用委托

b.通过Invoke调用委托

namespace Console0719
{
    class Program
    {
        public class DelegateTest
        {
            public static int add10(int a)
            {
                return 10 + a;
            }
            public static int add5(int a)
            {
                return 5 + a;
            }
        }
        //step1:声明委托(类似函数签名,无需实现)
        public delegate int Cal(int a);
        static void Main(strin
### C# 委托的详细解释及示例 #### 1. 委托的基本概念 在 C# 中,委托(Delegate)是一种类型安全的函数指针,它允许将方法作为参数传递或将方法赋值给委托实例[^1]。委托的主要作用是封装方法的引用,使得可以在运行时动态调用这些方法。通过委托,可以实现类似函数指针的功能,但与传统的函数指针不同的是,C# 中的委托是类型安全的。 委托的核心特性包括: - **类型安全**:每个委托都必须定义其返回类型和参数列表,确保只有符合签名的方法才能被绑定。 - **多播支持**:一个委托实例可以引用多个方法,并且可以通过单次调用执行所有绑定的方法[^2]。 #### 2. 委托的定义 委托的定义通常使用 `delegate` 关键字完成。以下是一个简单的委托定义示例: ```csharp public delegate void Operation(int a, int b); ``` 上述代码定义了一个名为 `Operation` 的委托类型,它可以引用任何返回值为 `void` 并接受两个整数参数的方法[^3]。 #### 3. 委托的使用 以下是委托的基本使用方式: ```csharp using System; public class Program { // 定义一个委托类型 public delegate void Operation(int a, int b); public static void Main(string[] args) { // 使用 Lambda 表达式创建委托实例 Operation addOperation = (a, b) => Console.WriteLine($"Sum: {a + b}"); Operation subtractOperation = (a, b) => Console.WriteLine($"Difference: {a - b}"); // 调用方法并传递委托 PerformOperation(addOperation, 5, 3); // 输出 Sum: 8 PerformOperation(subtractOperation, 5, 3); // 输出 Difference: 2 } public static void PerformOperation(Operation op, int x, int y) { op(x, y); // 调用传入的委托方法 } } ``` 在这个例子中,`Operation` 委托被用来引用两个不同的方法(Lambda 表达式)。通过这种方式,可以动态地选择要执行的操作。 #### 4. 委托在事件处理中的应用 委托在事件处理中非常常见。以下是一个简单的事件处理示例: ```csharp using System; // 声明一个委托类型 delegate void EventHandler(string message); class Publisher { // 定义一个事件 public event EventHandler OnEvent; // 触发事件的方法 public void RaiseEvent(string message) { OnEvent?.Invoke(message); } } class Subscriber { // 事件处理程序 public void HandleEvent(string message) { Console.WriteLine($"Event handled: {message}"); } } class Program { static void Main() { Publisher publisher = new Publisher(); Subscriber subscriber = new Subscriber(); // 订阅事件 publisher.OnEvent += subscriber.HandleEvent; // 触发事件 publisher.RaiseEvent("Hello from publisher!"); // 输出 Event handled: Hello from publisher! } } ``` 在这个例子中,`EventHandler` 委托被用来定义事件的签名。订阅者通过将方法绑定到事件来响应事件的发生[^4]。 #### 5. 委托的高级应用 除了基本的函数指针功能外,委托还支持以下高级特性: - **多播委托**:一个委托实例可以引用多个方法,并通过一次调用执行所有绑定的方法。 - **匿名方法和 Lambda 表达式**:可以使用匿名方法或 Lambda 表达式简化委托的创建过程。 - **泛型委托**:C# 提供了一些内置的泛型委托类型(如 `Action` 和 `Func`),可以减少自定义委托的需求。 例如,使用内置的泛型委托 `Action` 可以简化上述代码: ```csharp using System; class Program { public static void Main() { Action<int, int> addOperation = (a, b) => Console.WriteLine($"Sum: {a + b}"); Action<int, int> subtractOperation = (a, b) => Console.WriteLine($"Difference: {a - b}"); PerformOperation(addOperation, 5, 3); // 输出 Sum: 8 PerformOperation(subtractOperation, 5, 3); // 输出 Difference: 2 } public static void PerformOperation(Action<int, int> op, int x, int y) { op(x, y); // 调用传入的委托方法 } } ``` 在这里,`Action<int, int>` 是一个内置的泛型委托,用于替代自定义的 `Operation` 委托类型。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ellis1970

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值