Este artículo se tradujo de forma manual. Mueva el puntero sobre las frases del artículo para ver el texto original. |
Traducción
Original
|
IDisposable.Dispose (Método)
Realiza tareas definidas por la aplicación asociadas a la liberación o al restablecimiento de recursos no administrados.
Ensamblado: mscorlib (en mscorlib.dll)
Utilice este método para cerrar o liberar recursos no administrados como archivos, secuencias e identificadores mantenidos por una instancia de la clase que implementa esta interfaz. Por convención, este método se utiliza para realizar todas las tareas relacionadas con la liberación de los recursos de un objeto o todas las tareas relacionadas con la preparación de un objeto para que vuelva a utilizarse.
Importante
|
|---|
|
Los programadores de C++ deben leer Destructors and Finalizers in Visual C++. En .NET Framework versión 2.0, el compilador de C++ proporciona compatibilidad para implementar la eliminación determinística de los recursos y no permite la implementación directa del método Dispose. |
Cuando implemente este método, asegúrese de que se liberan todos los recursos utilizados mediante la propagación de la llamada a través de la jerarquía de contención. Por ejemplo, si un objeto A asigna un objeto B y el objeto B asigna un objeto C, la implementación del método Dispose de A debe llamar a Dispose n B que, a su vez, debe llamar a Dispose en C. Un objeto también debe llamar al método Dispose de su clase base si ésta implementa IDisposable.
Si se llama más de una vez al método Dispose de un objeto, éste debe pasar por alto todas las llamadas posteriores a la primera. El objeto no debe producir una excepción si su método Dispose se llama varias veces. Los métodos de instancia distintos de Dispose pueden producir una excepción ObjectDisposedException cuando ya se han desechado los recursos.
Quizás los usuarios esperen que un tipo de recurso utilice una convención determinada para indicar un estado de asignación frente a un estado de liberación. Un ejemplo de esto son las clases de secuencia, que tradicionalmente se consideran como abiertas o cerradas. El implementador de una clase que utilice este tipo de convención podría decidir implementar un método público con un nombre personalizado, como Close, que llame al método Dispose.
Como debe llamarse al método Dispose de forma explícita, los objetos que implementan IDisposable también deben implementar un finalizador para controlar la liberación de los recursos cuando no se llama a Dispose. De forma predeterminada, el recolector de elementos no utilizados llama automáticamente al finalizador de un objeto antes de reclamar su memoria. Sin embargo, una vez que se ha llamado al método Dispose, no suele ser necesario que el recolector de elementos no utilizados llame al finalizador del objeto desechado. Para evitar una finalización automática, las implementaciones de Dispose pueden llamar al método GC.SuppressFinalize.
Para obtener más información sobre cómo implementar finalizadores y el método Dispose, vea la clase GC, el método Object.Finalize e Implementar Finalize y Dispose para limpiar recursos no administrados.
Cuando se usa un objeto que tiene acceso a los recursos no administrados, como StreamWriter, es conveniente crear la instancia con una instrucción using. La instrucción using cierra el flujo automáticamente y llama a Dispose en el objeto cuando el código que está utilizándolo ha completado. Si necesita un ejemplo, vea la clase StreamWriter.
En el siguiente ejemplo se muestra cómo se puede implementar el método Dispose.
using System; using System.ComponentModel; // The following example demonstrates how to create // a resource class that implements the IDisposable interface // and the IDisposable.Dispose method. public class DisposeExample { // A base class that implements IDisposable. // By implementing IDisposable, you are announcing that // instances of this type allocate scarce resources. public class MyResource: IDisposable { // Pointer to an external unmanaged resource. private IntPtr handle; // Other managed resource this class uses. private Component component = new Component(); // Track whether Dispose has been called. private bool disposed = false; // The class constructor. public MyResource(IntPtr handle) { this.handle = handle; } // Implement IDisposable. // Do not make this method virtual. // A derived class should not be able to override this method. public void Dispose() { Dispose(true); // This object will be cleaned up by the Dispose method. // Therefore, you should call GC.SupressFinalize to // take this object off the finalization queue // and prevent finalization code for this object // from executing a second time. GC.SuppressFinalize(this); } // Dispose(bool disposing) executes in two distinct scenarios. // If disposing equals true, the method has been called directly // or indirectly by a user's code. Managed and unmanaged resources // can be disposed. // If disposing equals false, the method has been called by the // runtime from inside the finalizer and you should not reference // other objects. Only unmanaged resources can be disposed. protected virtual void Dispose(bool disposing) { // Check to see if Dispose has already been called. if(!this.disposed) { // If disposing equals true, dispose all managed // and unmanaged resources. if(disposing) { // Dispose managed resources. component.Dispose(); } // Call the appropriate methods to clean up // unmanaged resources here. // If disposing is false, // only the following code is executed. CloseHandle(handle); handle = IntPtr.Zero; // Note disposing has been done. disposed = true; } } // Use interop to call the method necessary // to clean up the unmanaged resource. [System.Runtime.InteropServices.DllImport("Kernel32")] private extern static Boolean CloseHandle(IntPtr handle); // Use C# destructor syntax for finalization code. // This destructor will run only if the Dispose method // does not get called. // It gives your base class the opportunity to finalize. // Do not provide destructors in types derived from this class. ~MyResource() { // Do not re-create Dispose clean-up code here. // Calling Dispose(false) is optimal in terms of // readability and maintainability. Dispose(false); } } public static void Main() { // Insert code here to create // and use the MyResource object. } }
Windows 7, Windows Vista SP1 o posterior, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008 (no se admite Server Core), Windows Server 2008 R2 (se admite Server Core con SP1 o posterior), Windows Server 2003 SP2
.NET Framework no admite todas las versiones de todas las plataformas. Para obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.
Importante