一旦System.ConsoleKey值完成使用后,如何使其无效(或指定另一个值)?

时间:2015-04-04 14:54:33

标签: c# .net input console console-application

我在这里有一个重复的代码,充满了goto语句,这使得while循环很好...重复永远。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            main();
        }

        public static ConsoleKeyInfo keyPressed;

        private static void main()
        {
            start:
            keyPressed = Console.ReadKey();

            while (true)
            {
                loopstart:

                if (keyPressed.Key == ConsoleKey.Enter)
                {
                    Console.WriteLine("You pressed the Enter Key!");
                    goto loopstart;
                }
                if (keyPressed.Key == ConsoleKey.Escape)
                {
                    Console.WriteLine("You pressed the Escape Key!");
                    goto loopstart;
                }
                if (keyPressed.Key == ConsoleKey.Spacebar)
                {
                    Console.WriteLine("You pressed the Spacebar!");
                    goto loopstart;
                }
                else
                {
                    break;
                }
            }

            Console.WriteLine("You broke the loop!");
            goto start;
        }
    }
}

如果不删除任何代码,是否可以将keyPressed.KeykeyPressed本身的值更改为NULL;声明它的状态,或者不是空格键的任何其他值/键,输入或转义键?

当然,可以通过删除代码中的所有goto loopstart;来解决问题,但这与问题无关。

我想要做的是使keyPressed.KeyNULL(或任何其他值)使所有IF语句都为false,这意味着不运行{ {1}}代码。


现在的问题是,当我尝试使用简单的goto loopstart使其无效时,它会出现以下错误:

  

无法将null转换为'System.ConsoleKeyInfo',因为它是一个不可为空的值类型。

有什么方法可以让我无效(或将值更改为其他内容)以便我可以打破循环?
(如:使keyPressed = null;语句达到必须运行IF代码的程度)

它应该类似于:

else

显然将... { loopstart: if (keyPressed.Key == ConsoleKey.Enter) { Console.WriteLine("You pressed the Enter Key!"); // keyPressed = null; <-- Does not work. // Do something to make ConsoleKey.Key to equal something else. goto loopstart; } if (keyPressed.Key == ConsoleKey.Escape) { Console.WriteLine("You pressed the Escape Key!"); ... 替换为工作代码?

如果这样做,第一次循环运行(假设在开始时按下的键是空格键,退出键或输入键)将导致// Do something to make ConsoleKey.Key to equal something else.被使用,第二次将跳过到goto loopstart;,它会要求另一把钥匙 然后,该过程以用户提供输入的速度重复,而不是不停地重复使用相同的键,或者要求另一个键。

基本上:让循环将goto start;语句作为正确的IF语句而不是IF循环运行。

See also

2 个答案:

答案 0 :(得分:4)

为什么要使用goto - 声明,它是非常过时的结构。您可以轻松continue循环。 else检查也是多余的。您可以在检查之前简单地从Console读取密钥,如下所示:

while (true)
{
    keyPressed = Console.ReadKey();

    switch (keyPressed.Key)
    {
        case ConsoleKey.Enter:
            Console.WriteLine("You pressed the Enter Key!");
            continue;

        case ConsoleKey.Escape:
            Console.WriteLine("You pressed the Escape Key!");
            continue;

        case ConsoleKey.Spacebar:
            Console.WriteLine("You pressed the Spacebar!");
            continue;
    }
    // should be outside the switch for breaking the loop
    break;
}

如果您要清除keyPressed,请使用default构造,如下所示:

keyPressed = default(ConsoleKeyInfo);

但你为什么要这样做呢?垃圾收集将自行清除内存,你不应该进入那里。

答案 1 :(得分:0)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            main();
        }

        public static ConsoleKeyInfo keyPressed;

        private static void main()
        {
        start:
            keyPressed = Console.ReadKey();

            while (true)
            {
            loopstart:

                if (keyPressed.Key == ConsoleKey.Enter)
                {
                    Console.WriteLine("You pressed the Enter Key!");
                    keyPressed = new ConsoleKeyInfo('a', ConsoleKey.A, false, false, false);
                    goto loopstart;
                }
                if (keyPressed.Key == ConsoleKey.Escape)
                {
                    Console.WriteLine("You pressed the Escape Key!");
                    goto loopstart;
                }
                if (keyPressed.Key == ConsoleKey.Spacebar)
                {
                    Console.WriteLine("You pressed the Spacebar!");
                    goto loopstart;
                }
                else
                {
                    break;
                }
            }

            Console.WriteLine("You broke the loop!");
            goto start;
        }
    }
}