我的C#事件无法正常触发,求排查及解决方法
解决C#事件无法触发输出"Right"的问题
问题根源分析
你的代码存在两个核心问题导致事件无法正常工作:
- 事件订阅时机错误:在调用
playerMoved.Move(movement)之后才绑定事件,此时事件已经触发完毕,订阅者无法收到通知。 - 多次读取按键导致判断失效:每个
if/else分支都调用Console.ReadKey(),用户单次按键只会被读取一次,后续分支会等待新的按键输入,导致右键分支永远无法触发。
修复后的代码
Program.cs
//File: Program.cs using PlayerMoveEvent1; using PlayerMoveEvent2; using MovementSpace; class Program { static void Main(string[] args) { // 初始化对象 var playerMoved = new PlayerMoves(); var moveRight = new MoveRight(); Movement movement = new Movement(); // 先绑定事件,确保触发时已有订阅者 playerMoved.PlayerMoved += moveRight.OnPlayerMoved; // 仅读取一次按键,避免多次读取导致判断逻辑混乱 ConsoleKeyInfo keyInfo = Console.ReadKey(); if (keyInfo.Key == ConsoleKey.UpArrow) { Console.WriteLine("\nYou moved forward."); } else if (keyInfo.Key == ConsoleKey.DownArrow) { Console.WriteLine("\nYou moved back."); } else if (keyInfo.Key == ConsoleKey.LeftArrow) { Console.WriteLine("\nYou moved left."); } else if (keyInfo.Key == ConsoleKey.RightArrow) { playerMoved.Move(movement); } else { System.Console.WriteLine("\nThat is not a valid movement."); System.Console.WriteLine("Please try again."); } } }
PlayerMove.cs(优化版本)
// File: PlayerMove.cs using System; using MovementSpace; namespace PlayerMoveEvent1 { public class PlayerMoves { // 使用.NET内置EventHandler替代自定义委托,简化代码 public event EventHandler PlayerMoved; public void Move(Movement movement) { Console.WriteLine("\nYou moved in this direction: "); OnPlayerMoved(); } protected virtual void OnPlayerMoved() { // 用空合并运算符简化空判断,同时保证线程安全 PlayerMoved?.Invoke(this, EventArgs.Empty); } } }
MovementRight.cs(清理无用引用)
// File: MovementRight.cs using System; using PlayerMoveEvent1; namespace PlayerMoveEvent2 { public class MoveRight { public void OnPlayerMoved(object source, EventArgs args) { Console.WriteLine("\nRight"); } } }
修复效果
运行程序后按下右键,控制台会依次输出:
You moved in this direction: Right
完全符合预期的事件触发逻辑。
内容的提问来源于stack exchange,提问作者Sushi Role
相关产品推荐
相关产品推荐

