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 using
declaraçã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".