utilizar a instrução – confirme a utilização correta de objetos descartáveis

A using instrução garante a utilização correta 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 instrução, é eliminada uma instância adquirida IDisposable . Em particular, a using instrução garante que uma instância descartável é eliminada mesmo que ocorra uma exceção no bloco da using instrução. No exemplo anterior, um ficheiro aberto é fechado depois de todas as linhas serem processadas.

Utilize a await using instrução para utilizar corretamente uma IAsyncDisposable instância:

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

Para obter mais informações sobre a utilização de IAsyncDisposable instâncias, veja a secção Utilizar assíncrona descartável do artigo Implementar um método DisposeAsync .

Também pode utilizar uma usingdeclaração que não requer chavetas:

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 numa using declaração, uma variável local é eliminada no final do âmbito em que é declarada. No exemplo anterior, a eliminação ocorre no final de um método.

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

Pode declarar várias instâncias do mesmo tipo numa instrução using , como mostra o exemplo seguinte:

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

Quando declara várias instâncias numa instrução using , estas são eliminadas por ordem inversa de declaração.

Também pode utilizar a instrução e a using declaração com uma instância de uma refestrução que se ajuste ao padrão descartável. Ou seja, tem um método de instância Dispose , que é acessível, sem parâmetros e tem um void tipo de retorno.

A using instrução também pode ser do seguinte formulário:

using (expression)
{
    // ...
}

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

StreamReader reader = File.OpenText(filePath);

using (reader)
{
    // Process file content
}

Aviso

No exemplo anterior, após o controlo sair da using instrução, uma instância descartável permanece no âmbito enquanto já está eliminada. Se utilizar ainda mais essa instância, poderá encontrar uma exceção, por exemplo, ObjectDisposedException. É por isso que recomendamos declarar uma variável descartável dentro da using instrução ou com a using declaração.

Especificação de idioma C#

Para obter mais informações, consulte a secção utilizar a instrução da especificação de idioma C# e a nota de proposta sobre "utilização baseada em padrões" e "utilizar declarações".

Ver também