我的 C# 事件有问题吗?

问题描述 投票:0回答:1

我试图编写一个事件,在调用该事件时将“right”一词写入屏幕,但它不起作用。关于如何让它发挥作用有什么想法吗?

我尝试用“+=”引发事件。然后我尝试将对象更改为 var 引用,但仍然无法使事件正常工作。由于某种原因,它仍然无法正常工作。这是我的代码:

//File: Program.cs
using PlayerMoveEvent1;
using PlayerMoveEvent2;
using PlayerMoveEvent3;
using PlayerMoveEvent4;
using PlayerMoveEvent5;
using MovementSpace;

class Program
{
    static void Main(string[] args)
    {
        //Objects for declaring events:
        var playerMoved = new PlayerMoves();
        var moveRight = new MoveRight();
        Movement movement = new Movement();


        

        Console.ReadKey();
            if (Console.ReadKey().Key == ConsoleKey.UpArrow)
            {
                Console.WriteLine("\nYou moved forward.");
            }
            else if (Console.ReadKey().Key == ConsoleKey.DownArrow)
            {
                Console.WriteLine("\nYou moved back.");
            }
            else if (Console.ReadKey().Key == ConsoleKey.LeftArrow)
            {
            }
            else if (Console.ReadKey().Key == ConsoleKey.RightArrow)
            {
                playerMoved.Move(movement);
                playerMoved.PlayerMoved += moveRight.OnPlayerMoved;
            }
            else
            {
                System.Console.WriteLine("\nThat is not a valid movement.");
                System.Console.WriteLine("Please try again.");
            }
    }
}

// File: MovementRight.cs
using System;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using PlayerMoveEvent1;

namespace PlayerMoveEvent2
{
    public class MoveRight
    {
        
        public void OnPlayerMoved(object source, EventArgs args)
        {
            
            Console.WriteLine("\nRight");

        }

        
    }
}

// File: PlayerMove.cs
using System;
using System.Reflection.Metadata.Ecma335;
using MovementSpace;

namespace PlayerMoveEvent1
{
    
    public class PlayerMoves
    {
        public delegate void PlayerMovesEventHandler(object source, EventArgs args);
        public event PlayerMovesEventHandler PlayerMoved;

        public void Move(Movement movement)
        {
            Console.WriteLine("\nYou moved in this direction: ");
            OnPlayerMoved();
        }

        protected virtual void OnPlayerMoved()
        {
            if (PlayerMoved != null)
            {
                PlayerMoved(this, EventArgs.Empty);
            }
        }

        
    }
}
c# events
1个回答
0
投票

您应该在构造函数或初始化方法中处理订阅,而不是在 Main 方法内订阅事件。多次订阅一个事件将无法正常工作,并且在条件块内订阅该事件可能不是您想要的。

在 if 条件下多次读取控制台键可能会导致意外行为。最好读取一次密钥并将其存储在变量中以便在多种情况下使用它。

更新了以下代码:

使用系统;

命名空间 PlayerMoveEvent { 班级计划 { 静态无效主(字符串[]参数) { // 用于声明事件的对象: var playerMoved = new PlayerMoves(); var moveRight = new MoveRight(); 运动运动 = new Movement();

        ConsoleKeyInfo key = Console.ReadKey();

        if (key.Key == ConsoleKey.UpArrow)
        {
            Console.WriteLine("\nYou moved forward.");
        }
        else if (key.Key == ConsoleKey.DownArrow)
        {
            Console.WriteLine("\nYou moved back.");
        }
        else if (key.Key == ConsoleKey.LeftArrow)
        {
            // Handle left movement
        }
        else if (key.Key == ConsoleKey.RightArrow)
        {
            playerMoved.Move(movement);
        }
        else
        {
            Console.WriteLine("\nThat is not a valid movement.");
            Console.WriteLine("Please try again.");
        }

        // Subscribe to the event after handling the movement
        playerMoved.PlayerMoved += moveRight.OnPlayerMoved;

        Console.ReadKey();
    }
}

// MoveRight class remains unchanged

// PlayerMoves class remains unchanged

}

© www.soinside.com 2019 - 2024. All rights reserved.