代码改变世界

什么是C#委托,什么是C#事件

  钟铧若岩  阅读(8)  评论(0编辑  收藏  举报

在 C# 中,委托和事件是两个重要的概念,它们在实现代码的灵活性、可维护性和可扩展性方面发挥着重要作用,下面分别详细介绍。

C# 委托

定义

 

委托是一种类型,它可以引用一个或多个方法。可以把委托看作是一个类型安全的函数指针,它允许将方法作为参数传递给其他方法,或者将方法赋值给变量,从而实现方法的动态调用。

声明委托

 

委托的声明语法类似于方法的声明,但需要使用 delegate 关键字。以下是一个简单的委托声明示例:
// 声明一个委托,该委托可以引用一个接受两个整数参数并返回整数的方法
delegate int MathOperation(int a, int b);

使用委托

 

下面的示例展示了如何使用上述声明的委托:
复制代码
using System;

// 声明一个委托,该委托可以引用一个接受两个整数参数并返回整数的方法
delegate int MathOperation(int a, int b);

class Program
{
    // 定义一个加法方法
    static int Add(int a, int b)
    {
        return a + b;
    }

    // 定义一个减法方法
    static int Subtract(int a, int b)
    {
        return a - b;
    }

    static void Main()
    {
        // 创建一个委托实例,并将 Add 方法赋值给它
        MathOperation operation = Add;

        // 调用委托实例,实际上是调用 Add 方法
        int result = operation(5, 3);
        Console.WriteLine("加法结果: " + result);

        // 将 Subtract 方法赋值给委托实例
        operation = Subtract;

        // 调用委托实例,实际上是调用 Subtract 方法
        result = operation(5, 3);
        Console.WriteLine("减法结果: " + result);
    }
}
复制代码

 

代码解释

 

  • 首先声明了一个 MathOperation 委托,它可以引用接受两个 int 类型参数并返回一个 int 类型结果的方法。
  • 然后定义了 Add 和 Subtract 两个方法,它们的签名与 MathOperation 委托匹配。
  • 在 Main 方法中,创建了一个 MathOperation 委托实例,并将 Add 方法赋值给它,通过委托实例调用 Add 方法。接着将 Subtract 方法赋值给委托实例,再次调用委托实例,实际上调用的是 Subtract 方法。

多播委托

 

委托还支持多播,即一个委托实例可以引用多个方法。可以使用 += 运算符为委托实例添加方法,使用 -= 运算符移除方法。
 
复制代码
using System;

// 声明一个委托,该委托可以引用一个接受一个字符串参数并返回 void 的方法
delegate void MessagePrinter(string message);

class Program
{
    static void PrintMessage1(string message)
    {
        Console.WriteLine("消息 1: " + message);
    }

    static void PrintMessage2(string message)
    {
        Console.WriteLine("消息 2: " + message);
    }

    static void Main()
    {
        // 创建一个委托实例,并添加两个方法
        MessagePrinter printer = PrintMessage1;
        printer += PrintMessage2;

        // 调用委托实例,会依次调用两个方法
        printer("Hello, World!");

        // 移除一个方法
        printer -= PrintMessage1;

        // 再次调用委托实例,只会调用剩余的方法
        printer("Hello again!");
    }
}
复制代码

C# 事件

定义

 

事件是基于委托的一种特殊机制,它提供了一种发布 - 订阅模式。在这种模式中,发布者(事件的拥有者)定义一个事件,当特定的事情发生时触发该事件;订阅者(对事件感兴趣的对象)可以订阅该事件,并在事件触发时执行相应的操作。

声明和使用事件

 

下面的示例展示了如何声明和使用事件:
复制代码
using System;

// 声明一个委托,用于定义事件的签名
delegate void MyEventHandler(string message);

class EventPublisher
{
    // 声明一个事件,基于上面声明的委托
    public event MyEventHandler MyEvent;

    // 触发事件的方法
    public void RaiseEvent(string message)
    {
        // 检查是否有订阅者
        if (MyEvent != null)
        {
            // 触发事件
            MyEvent(message);
        }
    }
}

class EventSubscriber
{
    // 处理事件的方法
    public void HandleEvent(string message)
    {
        Console.WriteLine("接收到事件消息: " + message);
    }
}

class Program
{
    static void Main()
    {
        // 创建事件发布者和订阅者实例
        EventPublisher publisher = new EventPublisher();
        EventSubscriber subscriber = new EventSubscriber();

        // 订阅事件
        publisher.MyEvent += subscriber.HandleEvent;

        // 触发事件
        publisher.RaiseEvent("这是一个事件消息");

        // 取消订阅事件
        publisher.MyEvent -= subscriber.HandleEvent;

        // 再次触发事件,由于已经取消订阅,不会执行处理方法
        publisher.RaiseEvent("这是另一个事件消息");
    }
}
复制代码

代码解释

 

  • 首先声明了一个 MyEventHandler 委托,用于定义事件的签名。
  • EventPublisher 类中声明了一个基于 MyEventHandler 委托的事件 MyEvent,并提供了一个 RaiseEvent 方法用于触发该事件。
  • EventSubscriber 类中定义了一个 HandleEvent 方法,用于处理事件。
  • 在 Main 方法中,创建了事件发布者和订阅者的实例,订阅者通过 += 运算符订阅了事件,当发布者调用 RaiseEvent 方法触发事件时,订阅者的 HandleEvent 方法会被执行。之后通过 -= 运算符取消订阅,再次触发事件时,订阅者的处理方法将不会被执行。

总结

 

委托是一种引用方法的类型,它允许将方法作为参数传递和动态调用;事件是基于委托的发布 - 订阅机制,用于实现对象之间的解耦和消息传递。

 

 

相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示