Partilhar via


usando declaração - garantir o uso correto de objetos descartáveis

A using instrução garante o uso correto de uma IDisposable instância:

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);
        }
    }
}

Quando o controlo sai do bloco da using sentença, a instância adquirida IDisposable é descartada. Em particular, a using declaração garante que uma instância descartável seja descartada mesmo que ocorra uma exceção dentro do bloco da using declaração. No exemplo anterior, um arquivo aberto é fechado depois que todas as linhas são processadas.

Use a await using instrução para usar corretamente uma IAsyncDisposable instância:

await using (var resource = new AsyncDisposableExample())
{
    // Use the resource
}

Para mais informações sobre o uso IAsyncDisposable de instâncias, consulte a secção Utilização de descartáveis assíncronos no artigo Implementar um método DisposeAsync .

Você também pode usar uma usingdeclaração que não exija chaves:

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;
}

Quando declarada em uma using declaração, uma variável local é descartada no final do escopo em que é declarada. No exemplo anterior, o descarte acontece no final de um método.

A referência da linguagem C# documenta a versão mais recentemente lançada da linguagem C#. Contém também documentação inicial para funcionalidades em pré-visualizações públicas para o próximo lançamento linguístico.

A documentação identifica qualquer funcionalidade introduzida pela primeira vez nas últimas três versões da língua ou em pré-visualizações públicas atuais.

Sugestão

Para saber quando uma funcionalidade foi introduzida pela primeira vez em C#, consulte o artigo sobre o histórico de versões da linguagem C#.

Uma variável declarada using pela instrução ou declaração é somente leitura. Não podes reatribuí-lo nem passá-lo como um ref parâmetro de OR out .

Você pode declarar várias instâncias do mesmo tipo em uma using instrução, como mostra o exemplo a seguir:

using (StreamReader numbersFile = File.OpenText("numbers.txt"), wordsFile = File.OpenText("words.txt"))
{
    // Process both files
}

Quando você declara várias instâncias em uma using instrução, elas são descartadas em ordem inversa de declaração.

Você também pode usar a instrução e a using declaração com uma instância de uma ref struct que se encaixa no padrão descartável. Ou seja, ele tem um método de instância Dispose que é acessível, sem parâmetros e tem um void tipo de retorno.

O return interior de um using bloco ainda garante a eliminação. O compilador reescreve-a num try/finally, de modo que o recurso Dispose seja sempre chamado antes de o método realmente regressar.

A using declaração também pode ter a seguinte forma:

using (expression)
{
    // ...
}

onde expression produz uma instância descartável. O exemplo seguinte demonstra essa forma:

StreamReader reader = File.OpenText(filePath);

using (reader)
{
    // Process file content
}

Aviso

No exemplo anterior, depois que o controle deixa a using instrução, uma instância descartável permanece no escopo enquanto já está descartada. Se você usar essa instância ainda mais, poderá encontrar uma exceção, por exemplo, ObjectDisposedException. Por isso, deve declarar uma variável descartável dentro da using declaração ou com a using declaração.

Especificação da linguagem C#

Para obter mais informações, consulte a seção usando instrução da especificação da linguagem C#.

Consulte também