none
Dúvida na implementação da Interface IDisposable RRS feed

  • Pergunta

  • Galera, encontrei vários e vários posts e máterias na internet a respeito... mas como cada lugar fala uma coisa a dúvida permanece...

    Em uma classe que implementa a interface IDisposable: como controlo (dou dispose) nas propriededas que possuem como tipo outra classe ou lista criada por mim?

    Exemplo:

    class MyClass: IDisposable
    {
         private listaInfo _listaInfo; /*listaInfo = List<Info>*/
         private bool _disposed;

    public Dispose()
    {
         Dispose(true);
         GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
          if (!this._disposed)
          {
                if (disposing)
                {
                     //Recursos não gerenciados
                      _listaInfo.Dispose();
                      _listaInfo = null;
                 }
                //Recursos não gerenciados
            }
            _disposed = true;       
    }

    ~MyClass()
    {
         Dispose(false);
    }

    }

    Minha lista é considerada um recurso gerenciado ou não gerenciado? Lembrando que a mesma também implementa a interface IDisposable.

    Outra coisa... após invocar o método Dispose() é necessário setar o objeto com Null ?

    Aguardo os eXperts...

    Obrigado!!!

    terça-feira, 9 de fevereiro de 2010 10:25

Respostas

  • Bruno,

    Pelo que eu entendi do IDisposable a idéia não é dar "free" em memória. Isso é problema do Garbage Collector.

    Se vc instancia algo. Ex:

    MinhaClasse c = new MinhaClasse();

    Ela está ocupando memória.

    Se vc fizer um c = null, em seguida um GC.Collect(), a memória já foi liberada.

    A idéia do IDisposable é permitir um mecanismo "fácil" para suportar a liberação de recursos não gerenciados. Ex.: Conexão de banco, arquivos, etc.

    A idéia é q qdo vc faz:

    using (MinhaClasse c = new MinhaClasse(){
      // Faz algo.
    }

    Ao término do bloco using, automaticamente o método dispose é invocado, liberando os tais recursos não gerenciados que a linguagem não tem como saber que vc está usando e esqueceu de fechar.



    Abraço,

    Eric
    terça-feira, 9 de fevereiro de 2010 13:01