问题描述
我一直在尝试使用goto创建函数,并且goto的标签在方法之外。我无法将标签添加到函数中,并且将标签公开会破坏所有内容。有办法解决吗?
我输入的代码非常小,因为它只是我想要发生的事情的演示:
public static void Main(string[] arg)
{
start:
}
public static void ToStart()
{
goto start;
}
解决方法
不,你不能那样做。请看一下Goto Statement in the C# Language Reference。
goto标识符语句的目标是带有给定标签的带标签的语句。如果当前函数成员中不存在具有给定名称的标签,或者goto语句不在标签范围内,则会发生编译时错误。
您已经在注释和其他答案中得到了一些建议。
在一种方法中,您主要要依赖结构化流控制if
,while
,for
,switch
等。很少使用goto
,但在某些用例中,它可以派上用场。但通常不是您想尝试的第一件事。
要将代码分解成逻辑单元,应该使用方法(就像您开始做的那样)。而不是使用goto
将控制权传递给另一个方法,而是“调用该方法”。与goto相比,方法有很大的好处,因为它们使您可以传递参数并将值返回给调用代码。还有示例调用:double z = Math.Max(x,y);
,在这里我调用Max
方法,该方法接受两个数字参数并返回最大值。
让我们假设您可以对其他方法执行goto
。这样我就可以编写这段虚构的代码了:
public static void ToStart()
{
goto start;
}
public static void DoStuff(int number,string text)
{
Console.WriteLine(number);
start:
Console.WriteLine(text);
}
假设是,如果我调用ToStart
,它将goto
直接插入DoStuff
的中间并继续调用Console.WriteLine(text);
-但是,值是多少? text
是?从来没有设置过。那可能而且可能会很糟糕。
让我们用有效的C#代码重写它,并查看应如何处理。
public static void ToStart()
{
DoStuffPartB("From ToStart");
}
public static void DoStuff(int number,string text)
{
Console.WriteLine(number);
DoStuffPartB(text);
}
public static void DoStuffPartB(string text)
{
Console.WriteLine(text);
}
此代码可以正常工作。
最重要的是,如果您使用goto
,则可能做错了什么。总是有一种避免它的方法。
问题是,Main
标签后面的start:
中有什么?然后我们建议适当重写。
为什么不使用函数?
goto:很少使用,可能用于嵌套循环,或者嵌套if