Yo diría que la interfaz IDisposable
es lo que buscas si necesitas una eliminación determinista de los recursos. Este suele ser el caso de los recursos no administrados, como los identificadores no administrados que deben cerrarse, las transmisiones o las conexiones de bases de datos.
En C++/CLI, si se declara un tipo administrado (ref class
y similares), IDisposable
se implementa utilizando la sintaxis destructor, y Dispose()
se llama mediante el uso de la palabra clave delete
. Si declara localmente un objeto de este tipo gestionado (sin utilizar el operador ^
o gcnew
), C++/CLI incluso llama automáticamente al Dispose()
cuando el objeto queda fuera del alcance. De esa manera, C++/CLI es más conveniente que C#.
No podrá llamar al delete
en el objeto al usar C#, en su lugar tendrá que llamar manualmente al Dispose()
. Otra forma de deshacerse de los objetos IDisposable
es el bloque using
.
El finalizador (implementado en C# utilizando la sintaxis de destructor) no es lo mismo que un destructor de C++, ya que no es determinista cuando se invocará. Los objetos con un finalizador están básicamente en cola hasta que el hilo del finalizador decida llamar a su finalizador, de modo que nunca se sabe exactamente cuándo se llama.
El mejor enfoque para tratar con recursos no administrados es probablemente una combinación de los dos. Vea aquí el enfoque recomendado:
http://msdn.microsoft.com/en-us/library/b1yfkh5e(v=vs.100).aspx
Tenga en cuenta, sin embargo, que cuando se utiliza IDisposable
, a pesar de que se puede disponer de los recursos no administrados de forma determinista, gestionan los objetos todavía tienen que ser recogidos por el recolector de basura (de manera no determinista).
Acabo de encontrar un artículo que explica las diferencias entre C++/CLI y C#. Puede encontrarlo interesante:
http://weblogs.thinktecture.com/cnagel/2006/04/ccli-finalize-and-dispose.html
La semántica de la pila C++/CLI también funciona en los miembros de la clase, no solo en los locales. No hay una forma simple de duplicar esto en C#. –
No lo sabía (no usa C++/CLI con mucha frecuencia). Gracias por la información :) – Botz3000
Acabo de volver a leer la respuesta y hay algo que necesito aclaración: si mi clase está definida en C# (e implementa IDisposable), ¿podré llamar "eliminar" al usarla? de otra clase C++/CLI? ¡Gracias! –