Pergunta

Se eu uso algo como:

using (OdbcConnection conn = new OdbcConnection(....))
{
  conn.open();
  my commands and sql, etc.
}

Eu tenho que fazer um Conn.Close (); Ou a declaração de uso me impede de fazer essa última chamada? Ele descarta tudo no bloco de uso? Por exemplo, se eu ligue para outros objetos não relacionados, isso também se despertaria automaticamente?

Obrigada. Eu não estava claro depois de ler sobre o uso no site da Microsoft. Quero ter certeza de que não tenho vazamentos de memória.

Foi útil?

Solução

  1. O bloco de uso será descartado da ODBCConnection.
  2. As regras normais do escopo funcionam para qualquer coisa declarada dentro do bloco de uso.
  3. O bloco de uso não limpará outros objetos idisposíveis. Ele apenas limpa o item declarado
    • Observe que você pode nidificar usando blocos ou se os itens tiverem o mesmo tipo, vários itens podem ser inicializados ao mesmo tempo.

Veja a parte superior da minha outra resposta para Como uso a palavra -chave usando C# Para um pouco mais de informação.

Devo também mencionar que você pode fechar (descartar) a conexão assim que terminar com ela para liberar o recurso. As diretrizes dizem que o chamador deve poder chamar repetidamente o método de disposição. O bloco de uso é essencialmente apenas uma rede de segurança e permite escrever um código mais claro na maioria das circunstâncias.


Editar] Por exemplo, a inicialização múltipla em um uso: Inicialize mais de um objeto no mesmo usando sem precisar nidificar usando blocos se os objetos forem do mesmo tipo:

using (Bitmap b1 = new Bitmap("file1"), b2 = new Bitmap("file2")) 
{ ... }

Joel Coehoorn mencionou empilhamento, que está nidificando, mas omitindo os aparelhos, assim como você pode omitir os aparelhos em um for, ou if declaração. A interface do usuário não se reformate com um recuo. Eu ficaria curioso para saber como é o IL.

using(Bitmap b = new Bitmap("filex"))
using(Graphics g = Graphics.FromImage(b))
{ 
}

É um erro usar para colocar objetos diferentes no mesmo usando error CS1044: Cannot use more than one type in a for, using, fixed, or declaration statement.

// error CS1044
using(Bitmap b = new Bitmap("filex"), Graphics g = Graphics.FromImage(b)) 

Outras dicas

A declaração de uso lidará com os métodos de fechamento e descarte para você.

Scott Hanselman tem uma explicação muito boa da instrução usando.

A declaração de uso garante que um objeto que implementa o idispose seja descartado. Ele apenas descartará o objeto que é referido no bloco de uso, para que seu código seja basicamente equivalente a:

OdbcConnection conn = new ....;
try
{
   conn.open();
   conn.....
}
finally
{
   conn.dispose();
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top