GC.ReRegisterForFinalize(Object) Método

Definição

Solicita que o sistema chame o finalizador para o objeto especificado para o qual SuppressFinalize(Object) já foi chamado.

public:
 static void ReRegisterForFinalize(System::Object ^ obj);
public static void ReRegisterForFinalize(object obj);
static member ReRegisterForFinalize : obj -> unit
Public Shared Sub ReRegisterForFinalize (obj As Object)

Parâmetros

obj
Object

O objeto para o qual um finalizador deve ser chamado.

Exceções

obj é null.

Exemplos

O exemplo seguinte demonstra como usar o ReRegisterForFinalize método para finalizar um objeto uma segunda vez após a recolha do lixo.

using System;

namespace ReRegisterForFinalizeExample
{
    class MyMainClass
    {
        static void Main()
        {
            // Create a MyFinalizeObject.
            MyFinalizeObject mfo = new MyFinalizeObject();

            // Release the reference to mfo.
            mfo = null;

            // Force a garbage collection.
            GC.Collect();

            // At this point mfo will have gone through the first Finalize.
            // There should now be a reference to mfo in the static
            // MyFinalizeObject.currentInstance field.  Setting this value
            // to null and forcing another garbage collection will now
            // cause the object to Finalize permanently.
            MyFinalizeObject.currentInstance = null;
            GC.Collect();
        }
    }

    class MyFinalizeObject
    {
        public static MyFinalizeObject currentInstance = null;
        private bool hasFinalized = false;

        ~MyFinalizeObject()
        {
            if(!hasFinalized)
            {
                Console.WriteLine("First finalization");

                // Put this object back into a root by creating
                // a reference to it.
                MyFinalizeObject.currentInstance = this;

                // Indicate that this instance has finalized once.
                hasFinalized = true;

                // Place a reference to this object back in the
                // finalization queue.
                GC.ReRegisterForFinalize(this);
            }
            else
            {
                Console.WriteLine("Second finalization");
            }
        }
    }
}
open System

[<AllowNullLiteral>]
type MyFinalizeObject() =
    let mutable hasFinalized = false
    
    static member val CurrentInstance = null with get, set

    override this.Finalize() =
        if hasFinalized then
            printfn "First finalization"

            // Put this object back into a root by creating a reference to it.
            MyFinalizeObject.CurrentInstance <- this

            // Indicate that this instance has finalized once.
            hasFinalized <- true

            // Place a reference to this object back in the finalization queue.
            GC.ReRegisterForFinalize this
        else 
            printfn "Second finalization"

// Create a MyFinalizeObject.
let mutable mfo = MyFinalizeObject()

// Release the reference to mfo.
mfo <- null

// Force a garbage collection.
GC.Collect()

// At this point mfo will have gone through the first Finalize.
// There should now be a reference to mfo in the static
// MyFinalizeObject.CurrentInstance property. Setting this value
// to null and forcing another garbage collection will now
// cause the object to Finalize permanently.
MyFinalizeObject.CurrentInstance <- null
GC.Collect()
Namespace ReRegisterForFinalizeExample
    Class MyMainClass
        Shared Sub Main()
            'Create a MyFinalizeObject.
            Dim mfo As New MyFinalizeObject()

            'Release the reference to mfo.
            mfo = Nothing

            'Force a garbage collection.
            GC.Collect()

            'At this point mfo will have gone through the first Finalize.
            'There should now be a reference to mfo in the static
            'MyFinalizeObject.currentInstance field.  Setting this value
            'to null and forcing another garbage collection will now
            'cause the object to Finalize permanently.
            MyFinalizeObject.currentInstance = Nothing
            GC.Collect()
        End Sub
    End Class

    Class MyFinalizeObject
        Public Shared currentInstance As MyFinalizeObject = Nothing
        Private hasFinalized As Boolean = False

        Protected Overrides Sub Finalize()
            If hasFinalized = False Then
                Console.WriteLine("First finalization")

                'Put this object back into a root by creating
                'a reference to it.
                MyFinalizeObject.currentInstance = Me

                'Indicate that this instance has finalized once.
                hasFinalized = True

                'Place a reference to this object back in the
                'finalization queue.
                GC.ReRegisterForFinalize(Me)
            Else
                Console.WriteLine("Second finalization")
            End If
            MyBase.Finalize()
        End Sub
    End Class
End Namespace

Observações

O ReRegisterForFinalize método adiciona o obj parâmetro à lista de objetos que solicitam finalização antes de o coletor de lixo libertar o objeto. O obj parâmetro deve ser o chamador deste método.

Chamar o ReRegisterForFinalize método não garante que o coletor de lixo chame o finalizador de um objeto.

Por defeito, todos os objetos que implementam finalizadores são adicionados à lista de objetos que requerem finalização; no entanto, um objeto pode já ter sido finalizado ou pode ter desativado a finalização ao chamar o SuppressFinalize método.

Um finalizador pode usar este método para ressuscitar-se a si próprio ou a um objeto que referencia.

Aplica-se a

Ver também