You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

我的C#事件无法正常触发,求排查及解决方法

解决C#事件无法触发输出"Right"的问题

问题根源分析

你的代码存在两个核心问题导致事件无法正常工作:

  1. 事件订阅时机错误:在调用playerMoved.Move(movement)之后才绑定事件,此时事件已经触发完毕,订阅者无法收到通知。
  2. 多次读取按键导致判断失效:每个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 23:32:01