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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top