none
É necessário dar dispose() em objeto após setá-lo como NULL ? RRS feed

  • Pergunta

  • Olaa,

                Digamos que eu tenha um objeto que represente uma Conexão com um banco, ou uma Transação ou Qualquer outro objeto que foi dado NEW, se logo após o uso do mesmo eu setá-lo como NULL, é necessário dar Dispose() no mesmo. Se sim, porque ? se não, porque ?


    Desde Já, Agradeço.

    Atenciosamente.


    • Editado _dev domingo, 26 de agosto de 2012 23:44
    domingo, 26 de agosto de 2012 23:43

Respostas

  • Olá Rodrigo,

    O ideal é utilizar o Dispose quando seu objeto consome algum recurso que o Garbage Collector pode não dar conta de livrar da memória, como por exemplo algum conteúdo não gerenciado (esse é o caso dos objetos de conexão com o banco de dados e buffer de arquivo, por exemplo). Caso vc atribua NULL para um objeto que é um IDisposable pode não ser suficiente para liberar todos os recursos da memória, pois como disse, pode ter algum conteúdo (algo não gerenciado) atrelado a execução deste objeto.

    Depois que vc atribuir o NULL para uma instância de objeto, não irá conseguir executar o Dispose no mesmo, pois agora ele é nulo.

    E sim, mesmo setando o valor NULL, pode ser que algum conteúdo não gerenciado fique em memória. Então, sempre que possível, execute o Dispose dos objetos que implementam IDisposable.

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    Microsoft MVP - Data Platform Development
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    • Marcado como Resposta _dev terça-feira, 28 de agosto de 2012 02:28
    terça-feira, 28 de agosto de 2012 01:01
    Moderador
  • Fala Rodrigo,

    É altamente recomendavel utilizar o Dispose, porque se você setar como null, você está tirando o objeto da memoria, porém, alguns recursos continuam ativos.

    Alguns exemplos, são: Abrir a conexão e não dar o dispose apenas setar como nulo, a conexão continua ativa.  Abrir um arquivo e seta-lo como nulo, ele continua travado para a sua aplicação.


    Nicolas Tarzia - Desenvolvedor de Software

    • Marcado como Resposta _dev terça-feira, 28 de agosto de 2012 02:28
    terça-feira, 28 de agosto de 2012 01:02

Todas as Respostas

  • Olá.

    É altamente recomendado a utilização de dispose para liberar os recursos que o objeto está consumindo.

    Leia mais em:

    http://www.devmedia.com.br/dicas-net-dispose-ou-nao-dispose/2586

    e nas referências oficiais:

    http://msdn.microsoft.com/pt-br/library/system.idisposable.dispose.aspx

    Att.

    Artur Barth

    • Sugerido como Resposta Artur Barth segunda-feira, 27 de agosto de 2012 01:51
    • Não Sugerido como Resposta _dev terça-feira, 28 de agosto de 2012 00:04
    segunda-feira, 27 de agosto de 2012 00:01
  • Olá Rodrigo,

    É recomendado que vc use o Dispose() ou o Using.

    Mas detalhe, o NULL se feito o Dispose não é obrigatório.

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    Microsoft MVP - Data Platform Development
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    segunda-feira, 27 de agosto de 2012 12:58
    Moderador
  • Depende.. o dispose libera de memória via GC e fecha qualquer conexão.

    NULL anula o valor no endereço de memória do objeto.

    Depende o que você quer fazer :)

    Eu daria um Dispose(); de uma vez.

    Lembre-se que o dispose consome memória para liberar recursos :D

    segunda-feira, 27 de agosto de 2012 16:00
  • Gostaria de Agradecer a todos pela atenção,

    Mas ainda possuo uma última dúvida:

    1) Mesmo sabendo que o NULL anula o valor no endereço de memória do objeto, esse objeto ainda consome recursos a ponto de que seja necessário realizar o Dispose() ?

    Novamente Obrigado.

    • Editado _dev terça-feira, 28 de agosto de 2012 00:01
    terça-feira, 28 de agosto de 2012 00:00
  • Olá Rodrigo,

    O ideal é utilizar o Dispose quando seu objeto consome algum recurso que o Garbage Collector pode não dar conta de livrar da memória, como por exemplo algum conteúdo não gerenciado (esse é o caso dos objetos de conexão com o banco de dados e buffer de arquivo, por exemplo). Caso vc atribua NULL para um objeto que é um IDisposable pode não ser suficiente para liberar todos os recursos da memória, pois como disse, pode ter algum conteúdo (algo não gerenciado) atrelado a execução deste objeto.

    Depois que vc atribuir o NULL para uma instância de objeto, não irá conseguir executar o Dispose no mesmo, pois agora ele é nulo.

    E sim, mesmo setando o valor NULL, pode ser que algum conteúdo não gerenciado fique em memória. Então, sempre que possível, execute o Dispose dos objetos que implementam IDisposable.

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    Microsoft MVP - Data Platform Development
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    • Marcado como Resposta _dev terça-feira, 28 de agosto de 2012 02:28
    terça-feira, 28 de agosto de 2012 01:01
    Moderador
  • Fala Rodrigo,

    É altamente recomendavel utilizar o Dispose, porque se você setar como null, você está tirando o objeto da memoria, porém, alguns recursos continuam ativos.

    Alguns exemplos, são: Abrir a conexão e não dar o dispose apenas setar como nulo, a conexão continua ativa.  Abrir um arquivo e seta-lo como nulo, ele continua travado para a sua aplicação.


    Nicolas Tarzia - Desenvolvedor de Software

    • Marcado como Resposta _dev terça-feira, 28 de agosto de 2012 02:28
    terça-feira, 28 de agosto de 2012 01:02
  • Muito Obrigado a todos pela atenção e paciencia dada ao respectivo post.

    Minha dúvida foi completamente sanada.

    Novamente muito obrigado.

    Abraço a todos.

    terça-feira, 28 de agosto de 2012 02:29