c# - 使用 goto 大小写(变量);在 C# 开关中

标签 c# switch-statement goto

我正在为 Visual Studio C# 控制台中的类(class)编写文本冒险,并决定使用 switch 语句而不是 if-elses 链,因为 goto case 非常有用(到目前为止效果非常好).我知道 switch 本身中的每个 case 都必须是一个常量,但我想知道这是否也扩展到使用 goto case。例如我有:

switch (location)
{
case 1:
  break;
case 2:
  break;
case 3:
  break;
//I have 10 cases, each representing a location such as "Orc Cave", I just cut it down for brevity
default:
  break;
}

我希望能够输入一个整数变量,然后转到该整数,我有以下方法可以实现:

string travel2 = Console.ReadLine();//inputs a integer representing each location
int travel2A = Convert.ToInt32(travel2);
if (1<=travel2A && travel2A<=10)
{
    goto case(travel2A);
}
else{
    goto case(2);//current location
}

一切正常,但有一个“预期恒定值”警告强调案例(travel2A)。是否可以通过一些调整使 goto case input 成为变量,或者这只是 switch 语句的限制?如果是后者,我可以做一个 if-elses 链,但我认为输入一个变量更方便。非常感谢对此的任何帮助!谢谢!

最佳答案

普通 goto 的标签需要在源代码中拼写出来。它们不是被求值的表达式;它们只是标识符goto case 的标签必须是常量表达式,在编译时计算,而不是在运行时计算。

我会提醒您不要使用任何严重依赖任何形式的“goto”的解决方案。对任何一种“goto”都有一种普遍的偏见; goto 被认为是不优雅的,并且使您的代码难以遵循。可以肯定的是,这种偏见背后有一些道理,尽管 C# 经过精心设计,因此不可能或不太可能出现最严重的“goto”滥用。 (C# 只允许在同一 block 内或从内部 block 到其包含 block 之一的 goto。它永远不允许从外部 block 到内部 block ,或在没有嵌套关系的两个 block 之间。这大大降低了可能性的“意大利面条代码”。)

我假设您正在学习一门类(class),您才刚刚开始学习 C#。随着您的进步,您将了解比切换案例更优雅的控制流技术。

虽然我们批评您的代码:请考虑使用 int.TryParse 而不是 Convert.ToInt32,并确保您处理用户键入的内容是不是整数。

关于c# - 使用 goto 大小写(变量);在 C# 开关中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19299864/

相关文章:

c# - 如何将从 MySQL 数据库获取的单行存储在变量中?

c# - 将查询字符串转换为 .Net 中的键值对

kotlin - 如何在 Kotlin 中实现 switch-case 语句

c++ - 为什么在另一个案例中允许在 block 内使用 case 语句?

c++ - 如何简化这个 typedef 不同的 switch 语句?

c# - goto 语句的替代方法

c++ - 从 catch 语句中使用 "go to"可以吗

使用 scanf 询问输入时产生无限循环的代码

c# - MySQL 如果不存在则插入/忽略

c# - 不错的简单 ASP.NET MVC2 C# 问题(Switch 语句)