C#委托与事件

在C#中,委托(Delegates)和事件(Events)是用于实现事件驱动编程的关键组件。

委托(Delegates)

委托是一种特殊的类型,它定义了方法的签名(即方法的返回类型和参数类型),并可以持有对具有相同签名的方法的引用。通过委托,你可以将方法当作参数传递、存储在变量中或者作为其他方法的返回值。这使得编程更加灵活,尤其是在设计回调方法或者异步处理时。

委托的声明和使用
csharp 复制代码
// 声明一个委托,它可以引用任何返回void且接受两个int参数的方法。
public delegate void MyDelegate(int a, int b);

public class Program
{
    // 一个符合委托签名的方法
    public static void Add(int x, int y)
    {
        Console.WriteLine($"{x} + {y} = {x + y}");
    }

    // 另一个符合委托签名的方法
    public static void Subtract(int x, int y)
    {
        Console.WriteLine($"{x} - {y} = {x - y}");
    }

    public static void Main()
    {
        // 创建委托实例并关联到Add方法
        MyDelegate del = new MyDelegate(Add);

        // 通过委托调用方法
        del(10, 20); // 输出: 10 + 20 = 30

        // 将委托关联到Subtract方法
        del = Subtract;

        // 再次通过委托调用方法
        del(10, 5); // 输出: 10 - 5 = 5
    }
}

事件(Events)

事件是一种使类或对象可以通知其他类或对象发生了某些事情的机制。在定义事件的类中,它通常是基于某个委托类型的字段,不过它使用了特殊的事件语法和两个附加的访问器 addremove 来管理委托的订阅者列表。

事件的声明和使用
csharp 复制代码
// 声明一个委托
public delegate void MyEventHandler(string message);

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

    // 触发事件的方法
    public void DoSomething(string message)
    {
        // 触发事件
        SomethingHappened?.Invoke(message);
    }
}

public class Subscriber
{
    // 事件处理器
    public void OnSomethingHappened(string message)
    {
        Console.WriteLine($"Received message: {message}");
    }
}

public class Program
{
    public static void Main()
    {
        Publisher publisher = new Publisher();
        Subscriber subscriber = new Subscriber();

        // 订阅事件
        publisher.SomethingHappened += subscriber.OnSomethingHappened;

        // 触发事件
        publisher.DoSomething("Hello, World!"); // 输出: Received message: Hello, World!

        // 取消订阅事件
        publisher.SomethingHappened -= subscriber.OnSomethingHappened;

        // 再次触发事件,由于没有订阅者,所以没有输出
        publisher.DoSomething("Hello again!");
    }
}

在上面的例子中,Publisher 类有一个名为 SomethingHappened 的事件,和一个触发该事件的方法 DoSomethingSubscriber 类有一个方法 OnSomethingHappened,它将被用作事件的处理器。在 Main 方法中,创建了 PublisherSubscriber 的实例,并将 subscriber.OnSomethingHappened 方法订阅到 publisher.SomethingHappened 事件。当 DoSomething 被调用时,它将触发事件,从而导致 OnSomethingHappened 方法被调用。如果取消订阅,那么 DoSomething 的调用将不会有任何效果,因为没有事件处理器与之关联。

相关推荐
cplmlm4 小时前
EF Core使用CodeFirst生成postgresql数据库表名以及字段名用蛇形命名法,而类名仍使用驼峰命名
c#
lingxiao168886 小时前
WebApi详解+Unity注入--下篇:Unity注入
unity·c#·wpf
lingxiao168889 小时前
WebApi详解+Unity注入--中篇:.net core的WebAPI
unity·c#·.netcore
ServBay9 小时前
C# 成为 2025 年的编程语言,7个C#技巧助力开发效率
后端·c#·.net
故事不长丨13 小时前
C#进制转换:从基础原理到实战应用
开发语言·c#·进制转换·16进制·2进制·10进制
liulilittle13 小时前
VEthernet 框架实现 tun2socks 的技术原理
网络·windows·c#·信息与通信·通信
云草桑13 小时前
.net AI API应用 客户发的信息提取对接上下游系统报价
ai·c#·.net·semantickernel·sk
故事不长丨15 小时前
C#File文件操作全解析:从基础用法到异常处理
服务器·开发语言·visualstudio·c#·文件操作·io流·file
工程师00715 小时前
C# 动态编程(基于 dynamic 类型)
开发语言·c#·dynamic·动态编程
用户2986985301416 小时前
C#: 在Word文档中添加或移除可编辑区域
后端·c#