我在这里有一个重复的代码,充满了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.Key
或keyPressed
本身的值更改为NULL
;声明它的状态,或者不是空格键的任何其他值/键,输入或转义键?
当然,可以通过删除代码中的所有goto loopstart;
来解决问题,但这与问题无关。
我想要做的是使keyPressed.Key
值NULL
(或任何其他值)使所有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
循环运行。
答案 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;
}
}
}