c# Recolección de basura (Recolección de basura)

En C#, la recolección de basura ( Garbage Collection ) es un mecanismo para administrar la memoria automáticamente. Es responsable de rastrear y liberar la memoria que ya no está en uso para que los programas puedan usar los recursos de memoria de manera eficiente.

El recolector de basura en C# lo proporciona y administra .NET Runtime (CLR). Utiliza una estrategia llamada "reciclaje generacional". Específicamente, el recolector de basura divide los objetos de memoria en tres generaciones: generación 0, generación 1 y generación 2. Los objetos recién creados se asignan primero a la generación 0. Cuando el recolector de basura comienza a ejecutarse, verifica todos los objetos y marca aquellos a los que todavía se hace referencia. Luego limpia esos objetos sin referencia y libera la memoria que ocupan. El espacio de memoria ocupado por los objetos limpiados se recupera y se puede utilizar nuevamente para asignar nuevos objetos.

A continuación se muestran algunos conceptos importantes sobre la recolección de basura de C#:

Recuento de referencias: algunos lenguajes de programación utilizan el recuento de referencias para realizar un seguimiento del número de referencias a un objeto de memoria. Cuando el recuento de referencias cae a cero, el objeto se considera basura y se recolecta. Pero en C#, el recolector de basura utiliza otras estrategias en lugar del simple recuento de referencias.

Método Finalizador: antes de que el objeto sea recolectado como basura, puede realizar algunas operaciones de limpieza definiendo el método Finalizador. CLR llama automáticamente a los métodos finalizadores. En C#, puede definir un método Finalizador utilizando la sintaxis ~ClassName.

Método Dispose : el método Dispose es una forma de liberar explícitamente recursos no administrados, como archivos abiertos o conexiones de bases de datos. Después de usar estos recursos, debe llamar al método Dispose del objeto para liberarlos, de modo que los recursos se liberen inmediatamente antes de la recolección de basura.

En la mayoría de los casos, no es necesario controlar manualmente la recolección de basura. El recolector de basura se ejecuta automáticamente y recupera la memoria que ya no está en uso según sea necesario. Sin embargo, puede utilizar los métodos proporcionados por la clase GC para controlar el comportamiento de la recolección de basura. Por ejemplo, el método GC.Collect() puede forzar la recolección de basura y el método GC.GetTotalMemory() puede obtener la cantidad total de memoria. usado actualmente.

En resumen, el mecanismo de recolección de basura de C# simplificará enormemente la administración de la memoria, lo que permitirá a los desarrolladores centrarse más en la lógica empresarial sin tener que preocuparse por administrar manualmente los recursos de memoria.
En C#, Dispose y destructor (Finalizer) son dos mecanismos diferentes para liberar recursos.


1.Método Dispose : el método Dispose es una forma de liberar explícitamente recursos no administrados. Los recursos no administrados son recursos asignados por el sistema operativo local u otros recursos externos, como identificadores de archivos abiertos, conexiones de bases de datos, etc. El programador debe llamar manualmente al método Dispose para garantizar que los recursos no administrados se liberen de manera oportuna. Normalmente, el método Dispose se llama inmediatamente después de que el objeto haya terminado de usar recursos no administrados.
Para utilizar el método Dispose correctamente, C# proporciona una interfaz IDisposable. Las clases que implementan la interfaz IDisposable deben implementar el método Dispose. Puede llamar al método Dispose manualmente o puede usar la instrucción de uso de C# para llamar automáticamente al método Dispose cuando salga del bloque de uso. La convención de nomenclatura para los métodos Dispose es comenzar con Dispose, como Dispose().

A continuación se muestra un ejemplo que demuestra cómo utilizar el método Dispose para liberar recursos no administrados:

class MyClass : IDisposable
{
    
    
    private IntPtr handle; // 非托管资源

    public void Dispose()
    {
    
    
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
    
    
        if (disposing)
        {
    
    
            // 释放托管资源
        }

        // 释放非托管资源
        // ...
    }

    ~MyClass()
    {
    
    
        Dispose(false);
    }
}

using (MyClass obj = new MyClass())
{
    
    
    // 使用 obj 对象
} // 在这里自动调用 Dispose 方法

2. Destructor (Finalizador) : El destructor es un mecanismo para liberar recursos, pero a diferencia del método Dispose, el recolector de basura llama automáticamente al destructor en lugar de hacerlo manualmente el programador. El destructor se ejecuta antes de que el objeto sea recolectado como basura y se utiliza para limpiar los recursos que contiene el objeto. En C#, los destructores se definen utilizando la sintaxis ~ClassName.
Cabe señalar que el tiempo de ejecución del destructor lo determina el recolector de basura, por lo que no se garantiza que se ejecute inmediatamente cuando ya no se haga referencia al objeto. Dado que el recolector de basura administra automáticamente la memoria, en la mayoría de los casos no es necesario utilizar explícitamente un destructor. Pero en algunos casos, cuando un objeto contiene recursos no administrados, se puede utilizar un destructor para garantizar que estos recursos se liberen de manera oportuna.

A continuación se muestra un ejemplo que demuestra cómo utilizar un destructor para liberar recursos no administrados:

class MyClass
{
    
    
    private IntPtr handle; // 非托管资源

    ~MyClass()
    {
    
    
        // 释放非托管资源
        // ...
    }
}

**```
总结:**
Dispose方法是一种显式释放非托管资源的方式,需要由程序员手动调用或使用using语句。析构函数是一种自动释放资源的机制,由垃圾回收器调用。在C#中,推荐使用Dispose方法来释放资源,而析构函数则主要用于处理非托管资源的释放。

Supongo que te gusta

Origin blog.csdn.net/qq_41942413/article/details/132633529
Recomendado
Clasificación