Diferença entre 'usando' e de escopo?
Pergunta
Qual é a diferença entre os dois trechos de código a seguir:
using (Object o = new Object())
{
// Do something
}
e
{
Object o = new Object();
// Do something
}
Eu comecei usando using
muito mais, mas estou curioso para saber o que os benefícios são, na verdade, em comparação com o escopo objetos.
Editar: dicas úteis que tirei a partir deste:
Jon Skeet:
Note que isso não forçar a coleta de lixo de qualquer maneira, forma ou formulário. coleta de lixo e de recursos prompt de limpeza são um pouco ortogonal.
Will Eddins comentário:
A menos que seus implementos classe a interface IDisposable, e tem uma função Dispose (), você não usar usando.
Solução
O primeiro trecho chama Dispose
no final do bloco - você só pode fazê-lo com os tipos que implementam IDisposable
, e que basicamente chama Dispose
em um bloco, finalmente, para que você possa usá-lo com os tipos que os recursos precisam de limpeza-se, por exemplo,
using (TextReader reader = File.OpenText("test.txt"))
{
// Use reader to read the file
}
// reader will be disposed, so file handle released
Note que este faz não coleção força de lixo de qualquer maneira, forma ou formulário. coleta de lixo e de recursos prompt de limpeza são um pouco ortogonal.
Basicamente, você deve usar uma declaração using
para praticamente qualquer coisa que implementa IDisposable
e que o seu bloco de código vai assumir a responsabilidade por (em termos de limpeza).
Outras dicas
No final do using
o objeto fica descartado (o objeto que você colocar dentro do parêntesis deve implementar IDisposable). O objecto fica disposta também em casos excepcionais. E você não tem que esperar para o GC para fazê-lo em algum momento (você controlá-lo).
EDIT: A desvantagem do escopo são:
- você não controla a disposição do objeto
- mesmo se você chamaria descarte no final do seu escopo, não seria seguro exceção
Apenas para mostrar literalmente a diferença ...
using (FileStream fileStream = new FileStream("log.txt", FileMode.OpenCreate))
{
//stuff with file stream
}
é o mesmo que ...
{
FileStream fileStream = new FileStream("log.txt", FileMode.OpenCreate);
try
{
//stuff with filestream
}
finally
{
if (fileStream != null)
((IDisposable)fileStream).Dispose();
}
}
onde como
{
FileStream fileStream = new FileStream("log.txt", FileMode.OpenCreate);
fileStream.Dispose();
}
é como é.
Consulte a documentação sobre IDisposable e desalocação de recursos determinável .
Basta colocar, no final do bloco using{}
, você pode confiável dispor de recursos alocados (por exemplo, perto identificadores de arquivos, conexões de banco de dados, etc.)
using
exige apenas uma implementação da interface IDisposable, e chama o método Dispose no final do escopo.
Para muita fúria argumentos sobre os objetos corretamente eliminação, há uma abundância de outros tópicos.