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 陳述式或宣告所宣告的變數是唯讀的。 您無法重新指派它,或將其傳遞為 refout 參數。

您可以在一個 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" 的建議說明。

另請參閱