OneBigLoser
OneBigLoser
发布于 2024-07-20 / 15 阅读
0
0

事件Event的基本概念

什么是事件

基本概念

事件(Event)是C#中的一种机制,用于实现对象之间的通知。当某个对象的状态发生变化时,它可以通过事件通知其他对象。事件通常与委托一起使用,委托定义了事件处理程序的签名,而事件则允许我们将这些处理程序与特定的事件相关联。

用途

  • 实现松耦合:对象之间不需要直接交互,通过事件机制可以实现松耦合。

  • 通知机制:当某个动作发生时通知其他对象,比如按钮点击、数据变化等。

在游戏开发中的用途

  • 玩家输入:处理键盘、鼠标或手柄的输入事件。

  • 游戏状态变化:当游戏中的某个状态发生变化时(如玩家死亡、关卡完成等),通知相关对象进行处理。

  • 动画和声音:在特定事件发生时触发动画或播放声音。

语法规则和声明

声明事件

  1. 定义委托

public delegate void EventHandler(string message);
  1. 声明事件

public event EventHandler OnEventOccurred;

  1. 触发事件

protected virtual void RaiseEvent(string message)
{
    if (OnEventOccurred != null)
    {
        OnEventOccurred(message);
    }
}

  1. 订阅事件

someObject.OnEventOccurred += EventHandlerMethod;
  1. 取消订阅事件

someObject.OnEventOccurred -= EventHandlerMethod;

示例代码及解释

示例1:基本使用

using System;

public delegate void EventHandler(string message);

public class Publisher
{
    public event EventHandler OnEventOccurred;

    public void DoSomething()
    {
        Console.WriteLine("Doing something...");
        RaiseEvent("事件发生了!");
    }

    protected virtual void RaiseEvent(string message)
    {
        if (OnEventOccurred != null)
        {
            OnEventOccurred(message);
        }
    }
}

public class Subscriber
{
    public void OnEventOccurred(string message)
    {
        Console.WriteLine("接收到事件: " + message);
    }
}

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

        publisher.OnEventOccurred += subscriber.OnEventOccurred;

        publisher.DoSomething();

        // 取消订阅
        publisher.OnEventOccurred -= subscriber.OnEventOccurred;
    }
}

解释

  • 定义了一个委托 EventHandler,接受一个字符串参数。

  • Publisher 类中声明了一个事件 OnEventOccurred

  • DoSomething 方法中调用 RaiseEvent 方法触发事件。

  • Subscriber 类中定义了一个事件处理方法 OnEventOccurred

  • Main 方法中,订阅并触发事件。

优点和缺点

优点

  • 松耦合:对象之间可以通过事件进行通信,而不需要直接引用对方。

  • 可扩展性:可以动态添加或删除事件处理程序,灵活性高。

缺点

  • 调试困难:事件链条可能较长,调试时难以跟踪事件的触发和处理过程。

  • 内存泄漏:如果事件处理程序没有正确取消订阅,可能导致内存泄漏。

基础练习题

  1. 创建一个事件 TemperatureChanged,当温度变化时触发事件,并在控制台中输出新温度。

  2. 创建一个按钮点击事件,当按钮被点击时触发事件,输出点击次数。

进阶练习题

  1. 创建一个游戏中的事件系统,包括玩家死亡、敌人生成等事件,并在这些事件发生时输出相应的信息。

  2. 实现一个简单的消息系统,允许订阅者订阅不同类型的消息,当发布者发布消息时,通知所有订阅者。


评论