Dispose()

30/10/2004 - 23:30 por Enrique | Informe spam
Hola Grupo

Como hago para que se destruya mi objeto (uno creado por mi)?
Yo le puse la interfaz IDisposable, y en el metodo Dispose() ejecuto
GC.Collect(), y pongo en null todas las variables incluyendo el mismo
objeto? Esta bien eso?

Preguntas similare

Leer las respuestas

#6 Enrique
01/11/2004 - 13:13 | Informe spam
Muchas gracias por todo

"Octavio Hernandez" wrote in message
news:
Enrique,

>> osea que yo tendria que incluir en mi Dispose() los object.Close() y
object.evento -= ?

a) Ten en cuenta que en la POO una clase puede utilizar a otra de dos
maneras: como heredero (heredando de ella) o como cliente (incluyendo una
instancia de ella).
1. Si estás utilizando la herencia, por ejemplo si creas una clase


MiSocket
que hereda de Socket, lo más probable es que no necesites programar el
Dispose() porque ya la clase base lo tiene, y tú podrás llamarlo
directamente cuando vayas a "destruir" tu objeto:

DECLARACION:
public MiSocket: Socket
{
// constructor
public MiSocket(): base() // aquí se llama al constructor de


Socket
{
// inicialización de tu clase
}
// ... más ...
// no hay que definir Dispose(), pues ya se hereda de Socket
}

USO:

MiSocket s = new MiSocket();
// ...
s.Dispose();
s = null;

2. Si tu clase no hereda de Socket, sino que dentro de tu clase has
declarado un objeto de la clase Socket, entonces tú eres el responsable de
crear y destruir ese campo:

DECLARACION:
public MiSocket : IDisposable // no hereda de Socket, pero implementa
IDisposable
{
private Socket s; // campo privado
// constructor
public MiSocket()
{
s = new Socket(); // creación del objeto interno
// más inicializaciones...
}
// hay que definir Dispose(),
// y lo más correcto es que también haya un finalizador...
private bool disposed = false; // variable que te dirá si ya se ha
hecho Dispose(), para no hacerlo dos veces...
public void Dispose()
{
if (!disposed)
{
s.Close();
disposed = true;
}
// finalizador
~MiSocket()
{
Dispose();
}
}

USO:

MiSocket s = new MiSocket();
// ...
s.Dispose();
s = null;

Fíjate que en ambos casos, cuando alguien esté usando un objeto de la


clase
y termine de trabajar con él simplemente deberá aplicarle Dispose(). Esto
hace posible que la gente utilice tu clase sin importarle cómo ha sido
programada.

Y todo esto que estamos hablando tiene que ver con clases que utilizan
recursos no-manejados, como sockets, ficheros, mapas de bits o conexiones


a
bases de datos. Si la clase utiliza únicamente recursos manejados (objetos
en memoria) lo más probable es que no haga falta incluirle un Dispose(),
dejando al recolector de basura la tarea de liberarlos.

El tema es un tema complejo pero que hay que comprender bien, te


recomiendo
seguir buscando información en la web o libros de C#. Lo del using déjalo
para más adelante, pues además de esto de Dispose() para entenderlo bien
hace falta tener claros otros conceptos, como el try/finally...

Slds - Octavio


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida