goto 可用于跳转到代码内的特定行,由标签指定。

goto 作为:

标签:

void InfiniteHello()
{
    sayHello:
    Console.WriteLine("Hello!");
    goto sayHello;
}

.NET 小提琴现场演示

case 语句:

enum Permissions { Read, Write };

switch (GetRequestedPermission())
{
    case Permissions.Read:
        GrantReadAccess();
        break;

    case Permissions.Write:
        GrantWriteAccess();
        goto case Permissions.Read; //People with write access also get read
}

.NET 小提琴现场演示

这在 switch 语句中执行多个行为时特别有用,因为 C#不支持 fall-through case 块

异常重试

var exCount = 0;
retry:
try
{
    //Do work
}
catch (IOException)
{
    exCount++;
    if (exCount < 3)
    {
        Thread.Sleep(100);
        goto retry;
    }
    throw;
}

.NET 小提琴现场演示

与许多语言类似,不鼓励使用 goto 关键字,但以下情况除外。

适用于 C# goto 的有效用法

  • switch 语句中的 fall-through 案例。

  • 多级休息。通常可以使用 LINQ,但它通常具有更差的性能。

  • 使用未包装的低级对象时的资源释放。在 C#中,低级对象通常应该包含在单独的类中。

  • 有限状态机,例如,解析器; 由编译器内部使用生成的 async / await 状态机。