什么是事件
基本概念
事件(Event)是C#中的一种机制,用于实现对象之间的通知。当某个对象的状态发生变化时,它可以通过事件通知其他对象。事件通常与委托一起使用,委托定义了事件处理程序的签名,而事件则允许我们将这些处理程序与特定的事件相关联。
用途
实现松耦合:对象之间不需要直接交互,通过事件机制可以实现松耦合。
通知机制:当某个动作发生时通知其他对象,比如按钮点击、数据变化等。
在游戏开发中的用途
玩家输入:处理键盘、鼠标或手柄的输入事件。
游戏状态变化:当游戏中的某个状态发生变化时(如玩家死亡、关卡完成等),通知相关对象进行处理。
动画和声音:在特定事件发生时触发动画或播放声音。
语法规则和声明
声明事件
定义委托:
public delegate void EventHandler(string message);
声明事件:
public event EventHandler OnEventOccurred;
触发事件:
protected virtual void RaiseEvent(string message)
{
if (OnEventOccurred != null)
{
OnEventOccurred(message);
}
}
订阅事件:
someObject.OnEventOccurred += EventHandlerMethod;
取消订阅事件:
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
方法中,订阅并触发事件。
优点和缺点
优点
松耦合:对象之间可以通过事件进行通信,而不需要直接引用对方。
可扩展性:可以动态添加或删除事件处理程序,灵活性高。
缺点
调试困难:事件链条可能较长,调试时难以跟踪事件的触发和处理过程。
内存泄漏:如果事件处理程序没有正确取消订阅,可能导致内存泄漏。
基础练习题
创建一个事件
TemperatureChanged
,当温度变化时触发事件,并在控制台中输出新温度。创建一个按钮点击事件,当按钮被点击时触发事件,输出点击次数。
进阶练习题
创建一个游戏中的事件系统,包括玩家死亡、敌人生成等事件,并在这些事件发生时输出相应的信息。
实现一个简单的消息系统,允许订阅者订阅不同类型的消息,当发布者发布消息时,通知所有订阅者。