finally 區塊無論是否發生異常、是否執行 return、break、continue,一定會執行(極少數環境終止除外)。專為資源清理設計:關閉檔案、釋放連線、釋放鎖定等。
using System;
public class MainClass
{
static void Main()
{
int i = 123;
string s = "Some string";
object o = s;
try
{
i = (int)o; // 無效轉換,拋出 InvalidCastException
}
catch { } // 吞掉異常(示範用,實務不建議)
finally
{
Console.Write("i = {0}", i); // 一定執行,輸出 123
}
Console.Read();
}
}
正常流程:try 完成 → finally → 後續代碼 異常流程:try 拋異常 → catch 處理 → finally → 後續代碼 無 catch:try 拋異常 → finally → 傳遞給上層呼叫者 try 中 return:執行 finally → 返回呼叫者
// 傳統寫法(需手動釋放)
StreamWriter sw = null;
try
{
sw = new StreamWriter("log.txt");
sw.WriteLine("資料");
}
finally
{
sw?.Close(); // C# 6+ null 條件運算子
}
// 現代寫法:using 區塊(編譯器自動產生 try-finally)
using (var sw = new StreamWriter("log.txt"))
{
sw.WriteLine("資料");
} // 此處自動呼叫 Dispose() → Close()
Environment.FailFast() 立即終止進程Thread.Abort() 中止(.NET Framework 行為複雜,.NET Core 已移除)finally 是資源管理的安全網。現代 C# 開發請優先使用 using / await using(C# 8+)配合 IDisposable/IAsyncDisposable,讓編譯器自動生成正確的 try-finally 模式,減少手寫錯誤風險。