usando a declaração (Referência C#)

Fornece uma sintaxe conveniente que garante o uso correto de IDisposable objetos. A partir de C# 8.0, a using declaração garante a utilização correta de IAsyncDisposable objetos.

Exemplo

O exemplo a seguir mostra como utilizar a using declaração.

string manyLines = @"This is line one
This is line two
Here is line three
The penultimate line is line four
This is the final, fifth line.";

using (var reader = new StringReader(manyLines))
{
    string? item;
    do
    {
        item = reader.ReadLine();
        Console.WriteLine(item);
    } while (item != null);
}

A declaração de utilização, introduzida em C# 8.0, não requer aparelhos:

string manyLines = @"This is line one
This is line two
Here is line three
The penultimate line is line four
This is the final, fifth line.";

using var reader = new StringReader(manyLines);
string? item;
do
{
    item = reader.ReadLine();
    Console.WriteLine(item);
} while (item != null);

Observações

File e Font são exemplos de tipos geridos que acedem a recursos não geridos (neste caso, alças de ficheiros e contextos de dispositivo). Existem muitos outros tipos de recursos não geridos e tipos de bibliotecas de classes que os encapsulam. Todos estes tipos devem implementar a IDisposable interface, ou a IAsyncDisposable interface.

Quando a vida útil de um IDisposable objeto se limita a um único método, deve declará-lo e instantaneamente na using declaração ou using declaração. A using declaração chama o Dispose método do objeto da forma correta quando este se desesmes. A using declaração faz com que o objeto saia do alcance assim que Dispose for chamado. Dentro do using bloco, o objeto é apenas de leitura e não pode ser modificado ou reatribuído. Uma variável declarada com uma using declaração é apenas leitura. Se o objeto implementar IAsyncDisposable em vez de IDisposable, qualquer formulário using chama o DisposeAsync e awaits o devolvido ValueTask. Para obter mais informações sobre IAsyncDisposable, consulte implementar um método DisposeAsync.

Ambas as using formas asseguram que Dispose (ou DisposeAsync) é chamada mesmo que ocorra uma exceção dentro do using bloco. Pode obter o mesmo resultado colocando o objeto dentro de um try bloco e, em seguida, chamando Dispose (ou DisposeAsync) num finally bloco; na verdade, é assim que a using declaração e a using declaração são traduzidas pelo compilador. O exemplo de código anteriormente expande-se para o seguinte código no tempo de compilação (note os aparelhos curly extra para criar o âmbito limitado para o objeto):

string manyLines = @"This is line one
This is line two
Here is line three
The penultimate line is line four
This is the final, fifth line.";

{
    var reader = new StringReader(manyLines);
    try
    {
        string? item;
        do
        {
            item = reader.ReadLine();
            Console.WriteLine(item);
        } while (item != null);
    }
    finally
    {
        reader?.Dispose();
    }
}

A sintaxe de declaração mais using recente traduz-se em código semelhante. O try bloco abre onde a variável é declarada. O finally bloco é adicionado no fecho do bloco de enclosing, tipicamente no final de um método.

Para mais informações sobre a try-finally declaração, consulte o artigo try-finally .

Várias instâncias de um tipo podem ser declaradas numa única using declaração, como mostra o exemplo seguinte. Note que não pode usar variáveis implicitamente dactilografadas (var) quando declara várias variáveis numa única declaração:

string numbers = @"One
Two
Three
Four.";
string letters = @"A
B
C
D.";

using (StringReader left = new StringReader(numbers),
    right = new StringReader(letters))
{
    string? item;
    do
    {
        item = left.ReadLine();
        Console.Write(item);
        Console.Write("    ");
        item = right.ReadLine();
        Console.WriteLine(item);
    } while (item != null);
}

Pode combinar várias declarações do mesmo tipo utilizando a sintaxe de declaração introduzida também com C# 8, como mostra o seguinte exemplo:

string numbers = @"One
Two
Three
Four.";
string letters = @"A
B
C
D.";

using StringReader left = new StringReader(numbers),
    right = new StringReader(letters);
string? item;
do
{
    item = left.ReadLine();
    Console.Write(item);
    Console.Write("    ");
    item = right.ReadLine();
    Console.WriteLine(item);
} while (item != null);

Pode instantaneaizar o objeto de recurso e depois passar a variável para a using declaração, mas esta não é uma boa prática. Neste caso, após o controlo deixar o using bloco, o objeto permanece no âmbito, mas provavelmente não tem acesso aos seus recursos não geridos. Por outras palavras, já não está totalmente inicializado. Se tentar utilizar o objeto fora do bloco, corre o using risco de causar uma exceção. Por esta razão, é melhor instantanear o objeto na declaração e limitar o using seu âmbito ao using bloco.

string manyLines = @"This is line one
This is line two
Here is line three
The penultimate line is line four
This is the final, fifth line.";

var reader = new StringReader(manyLines);
using (reader)
{
    string? item;
    do
    {
        item = reader.ReadLine();
        Console.WriteLine(item);
    } while (item != null);
}
// reader is in scope here, but has been disposed

Para obter mais informações sobre a eliminação de IDisposable objetos, consulte utilizando objetos que implementem iDisposable.

Especificação linguística C#

Para obter mais informações, consulte a declaração de utilização na especificação c. idiomas. A especificação linguística é a fonte definitiva para a sintaxe e utilização C#.

Ver também