【发布时间】:2021-04-14 05:37:47
【问题描述】:
我正在编写一个简单的 C# 控制台应用程序,如果 UserId 的输入无效,我通过使用 GoTo 语句返回标签来解决问题。
但我不确定我是否正确使用了该语句。即使不使用 GoTo 语句,如果有更好的方法来解决问题,我想解决吗?
public void CreateAccount()
{
Console.WriteLine("----- Create New Account -----\n" +
"Enter following account information:\n");
getUserID:
{
Console.WriteLine("Enter a UserID (Alphanumeric; no special characters): ");
string userid = Console.ReadLine();
if (!ValidUserID(userid))
{
Console.WriteLine("Userid can only contain A-Z, a-z & 0-9. Try again");
goto getUserID;
}
if (data.IsUserInFile(userid))
{
Console.WriteLine("Userid already exists. Try again");
goto getUserID;
}
}
}
我将对 Pin、AccountType、Balance、AccountStatus 等其他字段使用相同的方法,因此我想确保在扩展其使用之前以正确的方式执行此操作。
【问题讨论】:
-
使用
goto的最佳方式通常是不使用。但是您是否尝试过循环? -
如果一个循环就足够了,你为什么还要在这里使用
goto,让你的意图更加清晰? -
@jason.kaisersmith:“使用 GoTo 语句的唯一正确方法是不使用 GoTo 语句!”——你也碰巧错了.我同意
goto不应该用于大多数分支。但它在switch声明中是必不可少的,因为这是让case落入另一个case的唯一方法。 -
@PeterDuniho 。 . .我同意这个问题被关闭的原因。我还认为最好在Code Review Stack Exchange 上提出征求意见和实现工作代码的替代方法的问题。
-
@Flydog57 即使是伟大的 Dijkstra 也承认
goto有用途(也许不是在这里!),例如它经常用于紧密循环的算法中以打破内部循环,并重新排序分支.另见stackoverflow.com/questions/46586/goto-still-considered-harmful