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 狀態機。