怪奇物语

怪奇物语

首页 新随笔 联系 管理

C# 事件 发布订阅 解耦 event Action 委托

ConsoleApp\GemEqpService.cs

using System;
using System.Collections.Generic;

public class SendService
{
    // 定义一个事件,该事件将在消息发送时触发。
    // 事件使用Action委托,它接受一个元组作为参数,包含消息类型和消息内容。
    public event Action<(int MessageType, string Message)>? OnTerminalMessageReceived;

    public void SendMsg(int messageType, string message)
    {
        // 打印发送的消息到控制台
        System.Console.WriteLine("-->" + $"[{messageType}] {message}");
        // 触发事件,传递消息类型和消息内容
        // 注意这里使用了空合运算符(?.)来避免在没有订阅者时调用Invoke引发异常。
        OnTerminalMessageReceived?.Invoke((messageType, message));
    }
}

public class Subscriber
{
    public void SubscribeEvents(SendService service)
    {
        // 使用lambda表达式订阅事件,当有消息被发送时执行此匿名函数
        service.OnTerminalMessageReceived += (msg) =>
        {
            Console.WriteLine("<--" + $"[{msg.Item1}] {msg.Item2}");
        };
    }
}

ConsoleApp\Program.cs

public class Program
{
    public static async Task Main(string[] args)
    {
        // 创建服务实例,该实例将用于发送消息
        var sender = new SendService();
        // 创建订阅者实例,该实例将订阅消息接收事件
        var subscriber = new Subscriber();

        // 订阅sender实例的事件,使得每当有消息被发送时,subscriber能够接收到通知
        subscriber.SubscribeEvents(sender);

        // 发送两条不同的消息,这将触发事件,导致subscriber接收到通知并打印相应的信息
        sender.SendMsg(10, "Hello, World!");
        sender.SendMsg(20, "This is a test message.");
    }
}
posted on 2025-02-21 08:00  超级无敌美少男战士  阅读(116)  评论(0)    收藏  举报