Sobes.tech
Middle

¿Qué es la interfaz IDisposable y para qué se utiliza en C#?

sobes.tech AI

Respuesta de la IA

IDisposable — es una interfaz que proporciona un mecanismo para liberar recursos no gestionados. Contiene un método Dispose().

Se utiliza para:

  • Liberar recursos no gestionados: Como descriptores de archivos, conexiones a bases de datos, sockets de red. .NET no puede gestionar automáticamente estos recursos.
  • Limpieza después del uso: Garantiza que los objetos que consumen muchos recursos se liberen correctamente, incluso si ocurren excepciones.
  • Uso conjunto con el operador using: El operador using llama automáticamente al método Dispose() al finalizar el bloque de código, incluso si ocurre una excepción. Es la forma preferida de usar objetos que implementan IDisposable.

Ejemplo de implementación:

public class MyResource : IDisposable
{
    // Simulación de recurso no gestionado
    private bool isDisposed = false;
    private IntPtr unmanagedPointer;

    public MyResource()
    {
        // Asignación de recurso no gestionado
        unmanagedPointer = System.Runtime.InteropServices.Marshal.AllocHGlobal(100);
    }

    // Método Dispose de la interfaz IDisposable
    public void Dispose()
    {
        Dispose(true);
        // Anula la finalización, ya que los recursos ya han sido liberados
        GC.SuppressFinalize(this);
    }

    // Método virtual para implementar la lógica de liberación
    protected virtual void Dispose(bool disposing)
    {
        if (!isDisposed)
        {
            if (disposing)
            {
                // Liberar recursos gestionados, si los hay
                // ...
            }

            // Liberar recursos no gestionados
            System.Runtime.InteropServices.Marshal.FreeHGlobal(unmanagedPointer);
            unmanagedPointer = IntPtr.Zero;

            isDisposed = true;
        }
    }

    // Finalizador (destructor) para liberar recursos si Dispose no fue llamado explícitamente
    ~MyResource()
    {
        Dispose(false);
    }
}

Ejemplo de uso con using:

using (var resource = new MyResource())
{
    // Trabajo con el recurso
    // ...
} // Dispose() se llama automáticamente al salir del bloque using