HOWTO · Csharp
在 C# 中退出控制檯應用程式
有兩種主要方式可結束 C# 主控台應用程式:從 Main 返回,或呼叫 Environment.Exit() 方法立即終止程序。
本頁內容
C# 主控台應用程式完成工作後,請從 Main 返回。只有在必須從其他方法立即停止程序時,才使用 Environment.Exit()。從 Main 傳回整數,或將整數傳給 Environment.Exit(int),都會設定程序結束碼;主控台文字與結束碼是分開的。
從 Main 返回以結束應用程式
return 陳述式會結束目前的方法。當它結束 Main 時,應用程式的正常執行便告一段落;return 後的陳述式不會執行。若從巢狀方法返回,控制權只會交還給呼叫端,因此本身不會結束應用程式。一般正常結束時,建議從 Main 返回,因為這會遵循正常的控制流程,並讓周圍的 finally 區塊及資源清理程序得以執行。
void Main() 可以使用 return; 不帶值結束。int Main() 則可以傳回結束碼。以下完整範例會輸出狀態訊息,並傳回慣例上的成功碼。提供的執行觀察結果為 Work completed.,結束碼為 0。
執行此範例:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
using System;
class Program
{
static int Main()
{
Console.WriteLine("Work completed.");
return 0;
}
}
Work completed.
return 0; 會結束 Main,作業系統或呼叫此程序的程式會收到 0。若要表示失敗,請改為傳回非零碼。每個非零值的確切意義由你的程式或呼叫端定義。
使用 Environment.Exit() 從任何方法終止程序
Environment.Exit(int) 可以從 Main 以外的方法終止程序。它會立即以指定的整數結束碼終止程序,不會返回呼叫端。只有在無法採用正常堆疊展開時才使用它,例如刻意要求立即關閉;一般錯誤處理通常應回報問題,並從 Main 傳回適當的結束碼。
以下完整範例會在 StopApplication 中呼叫 Environment.Exit(0);這是 Main 以外的方法:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
using System;
class Program
{
static void Main()
{
StopApplication();
Console.WriteLine("This line is not reached.");
}
static void StopApplication()
{
Console.WriteLine("Stopping now.");
Environment.Exit(0);
}
}
此呼叫會提供結束碼 0,並在 StopApplication 返回前終止程序,因此控制流程不會到達 Main 中的下一行。提供的執行觀察結果涵蓋上方的 Main 範例,不包括此範例。像 Environment.Exit(1); 這樣的呼叫則會提供結束碼 1;這個整數會傳給作業系統或呼叫此程序的程式,而任何透過 Console.WriteLine 輸出的訊息都是另外的主控台輸出。此方法是 System.Environment 的靜態方法,因此使用 using System; 的檔案可以直接呼叫它。
選擇結束碼並了解清理行為
慣例上以 0 表示成功,非零值表示失敗。這只是慣例,並非適用於所有應用程式的統一對照方式:如果指令碼、服務管理員或其他呼叫端需要判讀結束碼,請記錄各碼的意義。從 Main 傳回整數和呼叫 Environment.Exit(int) 都會傳達程序結束碼。兩者都不會自動輸出文字;若要向使用者說明原因,請另外輸出診斷訊息。
程式可以正常結束時,建議從 Main 返回。方法正常返回時,控制流程離開 try 陳述式會執行 finally 區塊,而 using 宣告等範圍限定資源也會在其範圍結束時釋放。Environment.Exit() 會立即停止程序,因此不會進行正常的堆疊展開;尚待執行的 finally 區塊及受控清理程序都會略過。若要立即終止,請先透過正常控制流程刷新或關閉重要資源;若清理程序攸關資料保存或資源釋放,請避免使用立即終止。
區分程序結束、迴圈跳出、例外狀況與 Ctrl+C
break 陳述式會跳出最近一層的迴圈或 switch;執行流程會在該結構之後繼續。如果跳出迴圈後應結束程式,請讓執行流程到達 Main 的結尾,或在迴圈之後從 Main 返回。
擲回例外狀況會將控制權轉交給符合條件的處理常式。如果處理常式捕捉到例外狀況,且執行流程繼續,程序就尚未結束。請先處理該狀況;若應用程式需要結束,再選擇正常的返回路徑和合適的結束碼。未處理的例外狀況可能會結束程序,但若只把它當作終止捷徑,會模糊原本的控制流程與錯誤處理方式。
Ctrl+C 是來自主控台的取消要求,並非保證會優雅結束的命令。程式可以透過 Console.CancelKeyPress 觀察此要求;程序是否立即停止,或由處理常式取消預設回應,取決於事件處理方式和主控環境。若取消時需要進行清理,請記錄取消要求,並讓主要控制流程停止工作後正常返回。