Olá! Friday, 19 de April de 2024.



Dicas CódigoFonte.net
Monday, 07 de November de 2011

Interface IDisposable e o Garbage Collector

O principal uso da interface IDisposable é quando queremos liberar recursos não gerenciados. O Garbage Collector (Coletor de Lixo) automaticamente libera a memória alocada para um objeto gerenciado quando este objeto não está mais em uso. No entanto, não há como prever quando o Garbage Collector irá realizar a coleta do lixo. Além disso, o Garbage Collector não tem conhecimento de recursos não gerenciados, como identificadores de janela, ou abrir arquivos e fluxos.
Com o uso do método Dispose() da interface IDisposable, podemos explicitamente liberar os recursos não gerenciados em conjunto com o Garbage Collector.

using System;  using System.IO;   //Implementação da interface IDisposable public class MyReader : IDisposable {     //Um StreamReader, que apesar de trabalhar com     //recursos nao gerenciados, é um objeto do     //.Net framework e já tem implementada a interface     //IDisposable e é tratado como um objeto gerenciado     StreamReader reader;     bool disposed = false;       //Inicializa o reader     public MyReader(string file)     {         reader = new StreamReader(file);     }     //Utiliza recursos do reader normalmente            public string ReadToEnd()     {         return reader.ReadToEnd();     }       //Finalizador:     //Este metodo é o finalizador, que é invocado pelo GC     //para liberar os recursos.     //Todo a liberacao implementada dentro dele só será     //executada quando o metodo for invocado, porém não     //conseguimos saber quando isto vai acontecer e recursos     //importantes podem ficar presos até que isto aconteça.     ~MyReader()     {         Dispose(false);     }       //Quando o Dispose é acionado, os recursos gerenciados e     //não gerenciados são liberados e ainda avisamos o GC     //para nao acionar o finalizador pois ele já não é mais necessário     public void Dispose()     {         Dispose(true);         GC.SuppressFinalize(this);     }       private void Dispose(bool disposing)     {         //Caso o objeto ainda não tenha sido destruído         //libera-se os recursos         if (!this.disposed)         {             //Se o objeto estiver sendo destruído através do metodo             //Dispose libera-se os recurso gerenciados                   if (disposing)             {                 //Libera recursos gerenciados                 reader.Dispose();             }             //Sempre libera-se os recursos não gerenciados, como utilizacao de ponteiros             //em chamadas a API do Windows e já assume-se que os recursos foram liberados             disposed = true;         }     } }

Comentários do artigo [Novo comentário]

Nenhum comentário, seja o primeiro a comentar.
Para adicionar um comentário você deve efetuar o login


Gostou do CódigoFonte.net? Quer indicar a um amigo?
Preencha os campos a seguir.
Seu Nome:
Seu E-mail:
E-mail de seu Amigo:


CodigoFonte.net » Meu Mural » Competiva - Criação de Sites » Todos os Direitos Reservados © 2002/2010