using 陳述式 - 確保正確使用可處置的物件
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 執行個體的詳細資訊,請參閱實作 DisposeAsync 方法一文的使用非同步可處置項目一節。
您也可以使用不需要大括號的 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
宣告中宣告時,區域變數會在宣告的範圍結尾處置。 在上述範例中,處置會在方法結尾發生。
using
陳述式或宣告所宣告的變數是唯讀的。 您無法重新指派它,或將其傳遞為 ref
或 out
參數。
您可以在一個 using
陳述式中宣告相同類型的數個執行個體,如下列範例所示:
using (StreamReader numbersFile = File.OpenText("numbers.txt"), wordsFile = File.OpenText("words.txt"))
{
// Process both files
}
當您在一個 using
陳述式中宣告數個執行個體時,它們會以宣告的反向順序處置。
您也可以使用 using
陳述式和宣告搭配符合可處置模式的 ref 結構執行個體。 也就是說,它有執行個體 Dispose
方法,可存取、無參數且具有 void
傳回型別。
using
陳述式也可以是下列形式:
using (expression)
{
// ...
}
其中,expression
會產生可處置的執行個體。 下列範例示範:
StreamReader reader = File.OpenText(filePath);
using (reader)
{
// Process file content
}
警告
在上述範例中,在控制項離開 using
陳述式之後,可處置的執行個體會保留在範圍內,同時已處置。 如果您進一步使用該執行個體,可能會遇到例外狀況,例如 ObjectDisposedException。 這就是為什麼我們建議在 using
陳述式或 using
宣告中宣告可處置的變數。
C# 語言規格
如需詳細資訊,請參閱 C# 語言規格中的 using 陳述式一節,以及 "pattern-based using" 和 "using declarations" 的建議說明。