C# 使用什么来代替“引用”;“转到”-方法?

C# 使用什么来代替“引用”;“转到”-方法?,c#,C#,我对编程相当陌生,我意识到人们真的不喜欢“goto”方法。我想知道如何编写代码,允许用户决定输入多少条目?例如,在下面的代码中,用户输入一个名称,然后询问他/她是否要输入另一个名称。我如何在不使用“转到”方法的情况下执行此操作 public class GoToTest { public static void Main() { InputName: string name; Console.Write("Input name: "

我对编程相当陌生,我意识到人们真的不喜欢“goto”方法。我想知道如何编写代码,允许用户决定输入多少条目?例如,在下面的代码中,用户输入一个名称,然后询问他/她是否要输入另一个名称。我如何在不使用“转到”方法的情况下执行此操作

public class GoToTest
{
    public static void Main()
    {
        InputName:
        string name;
        Console.Write("Input name: ");
        name = Console.ReadLine();

        string decision;
        Console.WriteLine(""); //Empty line for increased readability
        Console.WriteLine("Would you like to input another name? Yes - No");
        decision = Console.ReadLine();
        if (decision == "Yes")
        {
            goto InputName;
        }
        else
        {
            Console.WriteLine("Name is " + name);
        }
    }
}

这样做的一个好模式是“无限”循环,当满足某个条件时,您将中断该循环:

while (true) {
 var input = GetInputFromConsole();
 if (input == "exit")
  break;
}

while循环的右大括号几乎是到顶部的一个goto。然而,这比goto更好,因为循环为变量和可视化缩进提供了作用域。这更容易理解。

这样做的一个好模式是一个“无限”循环,当满足某个条件时,您会中断该循环:

while (true) {
 var input = GetInputFromConsole();
 if (input == "exit")
  break;
}
while循环的右大括号几乎是到顶部的一个goto。然而,这比goto更好,因为循环为变量和可视化缩进提供了作用域。这更容易理解。

我一般不喜欢while(true),所以我不得不给出这个答案

do
{
    string name = GetName();
    Console.WriteLine("Would you like to input another name? (Y)es - (N)o");
}while(Console.ReadLine().ToUpper().StartsWith("Y"));
GetName可能如下所示

string GetName()
{
    Console.Write("Input name: ");
    return Console.ReadLine();
}
一般来说,我不喜欢while(true),所以我不得不给出这个答案

do
{
    string name = GetName();
    Console.WriteLine("Would you like to input another name? (Y)es - (N)o");
}while(Console.ReadLine().ToUpper().StartsWith("Y"));
GetName可能如下所示

string GetName()
{
    Console.Write("Input name: ");
    return Console.ReadLine();
}

通过如下检查退出条件,可以使其更整洁:

string decision = "y";
while (decision == "y")
{
    string name;
    Console.Write("Input name: ");
    name = Console.ReadLine();
    Console.WriteLine("Name is " + name);
    Console.Write("\nWould you like to input another name? y/n: ");
    decision = Console.ReadLine().ToLower();
}
\n
在字符串中为您提供一个新行。)

或者,您可以让用户在完成姓名输入后,自己点击回车键,从而让用户更轻松:

string name = "x"; // anything except an empty string
Console.WriteLine("Enter a blank line to finish...");
while (!string.IsNullOrWhiteSpace(name))
{
    Console.Write("\nInput name: ");
    name = Console.ReadLine();
    if (!string.IsNullOrWhiteSpace(name))
    {
        Console.WriteLine("Name is " + name);
    }
}

我用了
!string.IsNullOrWhiteSpace(name)
如果用户决定空行表示空格或制表符。

您可以通过检查如下退出条件使其更整洁:

string decision = "y";
while (decision == "y")
{
    string name;
    Console.Write("Input name: ");
    name = Console.ReadLine();
    Console.WriteLine("Name is " + name);
    Console.Write("\nWould you like to input another name? y/n: ");
    decision = Console.ReadLine().ToLower();
}
\n
在字符串中为您提供一个新行。)

或者,您可以让用户在完成姓名输入后,自己点击回车键,从而让用户更轻松:

string name = "x"; // anything except an empty string
Console.WriteLine("Enter a blank line to finish...");
while (!string.IsNullOrWhiteSpace(name))
{
    Console.Write("\nInput name: ");
    name = Console.ReadLine();
    if (!string.IsNullOrWhiteSpace(name))
    {
        Console.WriteLine("Name is " + name);
    }
}


我用了
!string.IsNullOrWhiteSpace(name)
以防用户决定空行表示空格或制表符。

使用循环,例如
while
在逻辑周围打一个
while(true){..}
,然后在
if
中打一个
if(decision!=“Yes”break;
。您可以让用户更容易:只允许一个“y”或“n”作为回应,并且不区分大小写。@AndrewMorton:你的评论让我想起了我曾经使用过的一个大型机系统,在这个系统中,你必须键入
Continue
,才能进入列表的下一页:)使用一个循环,例如
while
在你的逻辑周围打一个
while(true){..}
,然后在
if
中打一个
if(decision!=“Yes”break;
。您可以让用户更轻松:只允许一个“y”或“n”作为响应,并且不区分大小写。@AndrewMorton:您的评论让人想起了我曾经使用过的一个大型机系统,您必须键入
Continue
,才能进入列表中的下一页:)但是,执行ToUpper()和StartsWith()不是消耗了更多内存吗与循环直到该值等于另一个值(如@usr提供的答案)相比?我认为以这种延迟方式中断循环只是倒退。在您确定应该停止循环的点中断循环。不要设置标志以使其稍后停止。我不同意。基于条件的循环清楚地表明了循环执行的目的ion依赖于.Loop-based-while(true)将条件移动到一个或多个break语句,程序就会变得不清晰。无论如何,我高中的编程老师会因为我使用break(或continue;他不鼓励使用这些语句,就像goto语句一样):@MikeCofoed不要这样做。如果用户想继续输入值,最终你会耗尽整个堆栈。在这里使用递归更复杂。它正在建立一个与问题无关的框架调用堆栈。但是,通过执行ToUpper()和StartsWith()而不是循环,直到该值等于另一个值(如@usr提供的答案),你不是在消耗更多内存吗?我认为以这种延迟方式断开循环只是倒退。在确定应停止循环的点处中断循环。不要设置一个标志让它稍后停止。我不同意。基于条件的循环清楚地显示了循环执行所依赖的内容。基于while(true)的循环将条件移动到一个或多个break语句,程序将失去清晰度。无论如何,我高中的编程老师会因为我使用了break(或continue;正如goto声明一样,他劝阻了我):@MikeCofoed不要这样做。如果用户想继续输入值,最终你会耗尽整个堆栈。在这里使用递归更复杂。它建立了一系列与问题无关的框架堆栈。正如我在评论中对另一个答案所说的,我不认为它是一个“好的模式”。但由于这段代码简短明了,在这种简单的情况下,它可能很好,可读性也很好,所以我不想投反对票。:-)正如我在对另一个答案的评论中所说的,我不认为这是一个“好的模式”。但由于这段代码简短明了,在这种简单的情况下,它可能很好,可读性也很好,所以我不想投反对票。:-)