【问题标题】:Is there a way to access a label from another function? C# [closed]有没有办法从另一个函数访问标签? C# [关闭]
【发布时间】:2020-10-28 22:53:49
【问题描述】:

我一直在尝试用 goto 创建一个函数,而 goto 的标签在方法之外。我无法将标签添加到函数中并使标签公开会破坏一切。有没有办法解决?

我放的代码非常小,因为它只是我想要发生的事情的演示:

public static void Main(string[] arg)
{
     start:
}
public static void ToStart()
{
    goto start;
}

【问题讨论】:

  • 嗨泽汤,请看文章How to Ask。社区要求您在此处提问之前进行一些研究。在发布之前您可以做的几件事是 1) 尝试一下(总是一种很好的学习方式)和 2) 搜索 C# 语言参考或有关 C# 中 goto 的文章。版主可能会关闭此类问题。
  • 使用goto 几乎总是一个坏主意。它破坏了当前代码的流程,因此很难推断它是正确的。
  • 很抱歉,这是一个糟糕的问题。这是我决定注册帐户后关于堆栈溢出的第一篇文章。我会确保阅读你给我的链接。谢谢。
  • 这能回答你的问题吗? setjmp/longjmp in C#. Is it possible?

标签: c# function goto


【解决方案1】:

不,你不能那样做。请看Goto Statement in the C# Language Reference

goto 标识符语句的目标是具有给定标签的标记语句。如果当前函数成员中不存在具有给定名称的标签,或者 goto 语句不在标签范围内,则会发生编译时错误。

您在 cmets 和其他答案中得到了一些建议。

在您希望主要依赖结构化流控制的方法中ifwhileforswitch 等。很少使用goto,但在某些用例中它可以派上用场.但通常不是您想尝试的第一件事。

要将代码分解为逻辑单元,您应该使用方法(正如您已经开始做的那样)。而不是使用goto 将控制权传递给另一个方法,而是“调用该方法”。方法比 goto 有一个很大的好处,因为它们允许您将参数传递并返回值给调用代码。示例调用:double z = Math.Max(x,y); 我调用了Max 方法,该方法接受两个数字参数并返回最大值。

【讨论】:

    【解决方案2】:

    假设您可以对不同的方法执行goto。然后我就可以编写这段虚构的代码了:

    public static void ToStart()
    {
        goto start;
    }
    
    public static void DoStuff(int number, string text)
    {
        Console.WriteLine(number);
        start:
        Console.WriteLine(text);
    }
    

    假设如果我调用ToStart,它会直接在DoStuff 中间调用goto 并继续调用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,您可能做错了什么。 (几乎)总有办法避免它。

    问题是Mainstart: 标签之后的内容是什么?然后我们可以建议适当的重写。

    【讨论】:

      【解决方案3】:

      为什么不使用函数?

      goto: 很少使用,可能用于嵌套循环,或者嵌套 if

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-26
        • 2011-10-23
        • 1970-01-01
        • 1970-01-01
        • 2014-04-09
        相关资源
        最近更新 更多