none
Bloco Using RRS feed

  • Pergunta

  • Nunca usei o bloco using, estava lendo sobre e vi que a principal função dele é que ao final do bloco ele executa o método Dispose()

    O método Dispose() seria para fechar o que esta em aberto na memória, correto?

    Mas o Garbage Collection já nao faz isso automático?

    Qual outras boa funcionalidade de se usar o using ?

    E se eu usar o using nao preciso usar o try/catch/finaly ?


    [IMG]http://i42.tinypic.com/33zbgn8.jpg[/IMG]

    quarta-feira, 19 de março de 2014 19:21

Respostas

  • Rodrigo1810, Diego disse corretamente.

    Só incrementando, você não precisa ficar dependente apenas das classe que suporta o USING, a sua própria classe pode implementar o método GC, ou seja, sua classe Usuario pode implementar o USING também, porém, precisa implementar na mão nos métodos da classe.


    Se a resposta foi útil por favor qualifique. Italo Biguzi Duarte, Desenvolvedor ASP.NET C#, Italo.biguzzi@gmail.com

    • Sugerido como Resposta Rafa sibeira quinta-feira, 20 de março de 2014 01:06
    • Marcado como Resposta Giovani Cr quarta-feira, 26 de março de 2014 18:39
    quinta-feira, 20 de março de 2014 00:44
  • Sugiro que você dê uma olhada neste artigo:

    Implementing IDisposable and the Dispose Pattern Properly - CodeProject

    É em inglês, mas tem os exemplos de código que você precisa.

    Um exemplo de uma classe que implementa o IDisposable:

    public class ComplexCleanupBase : IDisposable { private bool disposed = false; // para detectar chamadas redundantes public ComplexCleanupBase() { // Construtor da classe, onde são alocados (criados) recursos, tais como variáveis e etc. } protected virtual void Dispose(bool disposing) { if (!disposed) { if (disposing) { //Aqui você limpa a memória nulificando variáveis, e/ou chamando o método Dispose delas

    } //lógica compartilhada disposed = true; } } ~ComplexCleanupBase() // Método destrutor { Dispose(false); } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } }


    Esse código é um exemplo que eu peguei do artigo....


    Herbert Lausmann

    Meu BlogMeu perfil no Facebook
    • Editado Herbert Lausmann quarta-feira, 19 de março de 2014 23:15
    • Marcado como Resposta Giovani Cr quarta-feira, 26 de março de 2014 18:39
    quarta-feira, 19 de março de 2014 23:14
  • Olá Rafael, blz?

    Somente agregando mais informações a todas as respostas.

    Usar o Using é claro que é muito bom, mas não quer dizer que no momento que o bloco for finalizado o GC limpará a memória, o que acontece é que no fechamento do bloco Using o método Dispose é disparado, entretando, para se usar o Using a classe deverá implementar a interface Idisposable conforme o Herbert disse. No método dispose é sinalizado para o GC que aquele espaço em memória que foi reservado para o objeto já pode ser liberado. Uma prática legal é usa-lo na declaração de DataReader.



    Wennder Santos

    • Editado Wennder SantosMVP quinta-feira, 20 de março de 2014 02:59
    • Marcado como Resposta Giovani Cr quarta-feira, 26 de março de 2014 18:39
    quinta-feira, 20 de março de 2014 01:28
  • Olá,

    se implementado da interface Idisposable, o dispose já cria o método implementado assim:

    Dispose(true);
    GC.SuppressFinalize(this);
    

    De uma olhada também na documentação, segue os links:

    Implementando um metodo dispose

    Método Idisposable.Dispose


    Wennder Santos

    • Marcado como Resposta Giovani Cr quarta-feira, 26 de março de 2014 18:39
    quinta-feira, 20 de março de 2014 22:52

Todas as Respostas

  • Rodrigo1810,

    Exato, ela fechará os recursos da classe instanciada no escopo !!!!

    Quando uma aplicação executa o operador new e não existe espaço suficiente para alocação do objeto dentro do managed heap o garbage collector entra em ação e começa a coletar lixo ou seja existe o momento correto do GC entrar em ação , diferente do Using que liberar os recursos no final do escopo.

    o Uso de using é simplesmente uma boa pratica , vc não vai se preocupar mais se em ficar dando Close() ou Dispose().

    Por convenção não usaria o Finaly , mas o try e Catch normal.



    Diego Almeida Barreto
    System Analyst / Software Developer


    quarta-feira, 19 de março de 2014 20:34
  • Só para constar, você só pode usar o bloco using em objetos que implementem a interface IDisposable.

    Herbert Lausmann

    Meu BlogMeu perfil no Facebook

    quarta-feira, 19 de março de 2014 20:41
  • Supomos que eu tenho um objeto de uma classe no escopo:

    Pessoas obj = new Pessoas();

    no método Dispose(), como eu "jogaria esse objeto no lixo"?

    Só objetos que eu preciso jogar fora ou variáveis também?


    [IMG]http://i42.tinypic.com/33zbgn8.jpg[/IMG]

    quarta-feira, 19 de março de 2014 21:47
  • Sugiro que você dê uma olhada neste artigo:

    Implementing IDisposable and the Dispose Pattern Properly - CodeProject

    É em inglês, mas tem os exemplos de código que você precisa.

    Um exemplo de uma classe que implementa o IDisposable:

    public class ComplexCleanupBase : IDisposable { private bool disposed = false; // para detectar chamadas redundantes public ComplexCleanupBase() { // Construtor da classe, onde são alocados (criados) recursos, tais como variáveis e etc. } protected virtual void Dispose(bool disposing) { if (!disposed) { if (disposing) { //Aqui você limpa a memória nulificando variáveis, e/ou chamando o método Dispose delas

    } //lógica compartilhada disposed = true; } } ~ComplexCleanupBase() // Método destrutor { Dispose(false); } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } }


    Esse código é um exemplo que eu peguei do artigo....


    Herbert Lausmann

    Meu BlogMeu perfil no Facebook
    • Editado Herbert Lausmann quarta-feira, 19 de março de 2014 23:15
    • Marcado como Resposta Giovani Cr quarta-feira, 26 de março de 2014 18:39
    quarta-feira, 19 de março de 2014 23:14
  • Rodrigo1810, Diego disse corretamente.

    Só incrementando, você não precisa ficar dependente apenas das classe que suporta o USING, a sua própria classe pode implementar o método GC, ou seja, sua classe Usuario pode implementar o USING também, porém, precisa implementar na mão nos métodos da classe.


    Se a resposta foi útil por favor qualifique. Italo Biguzi Duarte, Desenvolvedor ASP.NET C#, Italo.biguzzi@gmail.com

    • Sugerido como Resposta Rafa sibeira quinta-feira, 20 de março de 2014 01:06
    • Marcado como Resposta Giovani Cr quarta-feira, 26 de março de 2014 18:39
    quinta-feira, 20 de março de 2014 00:44
  • Olá Rafael, blz?

    Somente agregando mais informações a todas as respostas.

    Usar o Using é claro que é muito bom, mas não quer dizer que no momento que o bloco for finalizado o GC limpará a memória, o que acontece é que no fechamento do bloco Using o método Dispose é disparado, entretando, para se usar o Using a classe deverá implementar a interface Idisposable conforme o Herbert disse. No método dispose é sinalizado para o GC que aquele espaço em memória que foi reservado para o objeto já pode ser liberado. Uma prática legal é usa-lo na declaração de DataReader.



    Wennder Santos

    • Editado Wennder SantosMVP quinta-feira, 20 de março de 2014 02:59
    • Marcado como Resposta Giovani Cr quarta-feira, 26 de março de 2014 18:39
    quinta-feira, 20 de março de 2014 01:28
  • Olá Rafael, blz?

    Somente agregando mais informações a todas as respostas.

    Usar o Using é claro que é muito bom, mas não quer dizer que no momento que o bloco for finalizado o GC limpará a memória, o que acontece é que no fechamento do bloco Using o método Dispose é disparado, entretando, para se usar o Using a classe deverá implementar a interface Idisposable conforme o Herbert disse. No método dispose é sinalizado para o GC que aquele espaço em memória que foi reservado para o objeto já pode ser liberado. Uma prática legal é usa-lo na declaração de DataReader.



    Wennder Santos


    Mas como eu faço essa sinalização no método Dispose?

    [IMG]http://i42.tinypic.com/33zbgn8.jpg[/IMG]

    quinta-feira, 20 de março de 2014 22:20
  • Olá,

    se implementado da interface Idisposable, o dispose já cria o método implementado assim:

    Dispose(true);
    GC.SuppressFinalize(this);
    

    De uma olhada também na documentação, segue os links:

    Implementando um metodo dispose

    Método Idisposable.Dispose


    Wennder Santos

    • Marcado como Resposta Giovani Cr quarta-feira, 26 de março de 2014 18:39
    quinta-feira, 20 de março de 2014 22:52
  • Olá, Rodrigo!

    conseguiu entender ou ter uma ideia pelo menos?

    Wennder Santos

    segunda-feira, 24 de março de 2014 21:28