using 陳述式可確保正確使用 IDisposable 執行個體:
var numbers = new List<int>();
using (StreamReader reader = File.OpenText("numbers.txt"))
{
string line;
while ((line = reader.ReadLine()) is not null)
{
if (int.TryParse(line, out int number))
{
numbers.Add(number);
}
}
}
當控制權離開語句區 using 塊時,所取得 IDisposable 的實例即被處置。 尤其是 using 陳述式會確保即使在 using 陳述式的區塊內發生例外狀況,也會一併處置可處置的執行個體。 在上述範例中,開啟的檔案會在處理所有行之後關閉。
使用 await using 陳述式以正確使用 IAsyncDisposable 執行個體:
await using (var resource = new AsyncDisposableExample())
{
// Use the resource
}
欲了解更多使用IAsyncDisposable實例的資訊,請參閱「實作非同步棄置方法」文章中的「使用 非同步一次性」章節。
您也可以使用不需要大括號的 using宣告:
static IEnumerable<int> LoadNumbers(string filePath)
{
using StreamReader reader = File.OpenText(filePath);
var numbers = new List<int>();
string line;
while ((line = reader.ReadLine()) is not null)
{
if (int.TryParse(line, out int number))
{
numbers.Add(number);
}
}
return numbers;
}
在 using 宣告中宣告時,區域變數會在宣告的範圍結尾處置。 在上述範例中,處置會在方法結尾發生。
C# 語言參考資料記錄了 C# 語言最新版本。 同時也包含即將推出語言版本公開預覽功能的初步文件。
文件中標示了語言最近三個版本或目前公開預覽版中首次引入的任何功能。
小提示
欲查詢某功能何時首次在 C# 中引入,請參閱 C# 語言版本歷史的條目。
using 陳述式或宣告所宣告的變數是唯讀的。 你無法重新指派或以 or out 參數傳遞ref它。
您可以在一個 using 陳述式中宣告相同類型的數個執行個體,如下列範例所示:
using (StreamReader numbersFile = File.OpenText("numbers.txt"), wordsFile = File.OpenText("words.txt"))
{
// Process both files
}
當您在一個 using 陳述式中宣告數個執行個體時,它們會以宣告的反向順序處置。
您也可以使用 using 陳述式和宣告搭配符合可處置模式的 ref 結構執行個體。 也就是說,它有一個可存取、無參數且具有Dispose傳回類型的實例void方法。
在方塊內using仍return能保證處理。 編譯器會把它重寫成 try/finally,所以資源的 Dispose s 總是在方法真正回傳之前被呼叫。
using 陳述式也可以是下列形式:
using (expression)
{
// ...
}
其中,expression 會產生可處置的執行個體。 以下範例說明了該形式:
StreamReader reader = File.OpenText(filePath);
using (reader)
{
// Process file content
}
警告
在上述範例中,在控制項離開 using 陳述式之後,可處置的執行個體會保留在範圍內,同時已處置。 如果您進一步使用該執行個體,可能會遇到例外狀況,例如 ObjectDisposedException。 這就是為什麼你應該在陳述中或宣告中using宣告一個可拋棄變數using。
C# 語言規格
如需詳細資訊,請參閱 C# 語言規格的 using 陳述式一節。