GC.ReRegisterForFinalize(Object) Método
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Solicita que o sistema chame o finalizador do objeto especificado para o qual SuppressFinalize(Object) foi chamado anteriormente.
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 a seguir demonstra como usar o ReRegisterForFinalize método para finalizar um objeto uma segunda vez após a coleta de lixo.
using namespace System;
ref class MyFinalizeObject
{
public:
static MyFinalizeObject^ currentInstance = nullptr;
private:
bool hasFinalized;
public:
MyFinalizeObject()
{
hasFinalized = false;
}
~MyFinalizeObject()
{
if ( hasFinalized == false )
{
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" );
}
}
};
int main()
{
// Create a MyFinalizeObject.
MyFinalizeObject^ mfo = gcnew MyFinalizeObject;
// Release the reference to mfo.
mfo = nullptr;
// 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 0 and forcing another garbage collection will now
// cause the object to Finalize permanently.
MyFinalizeObject::currentInstance = nullptr;
GC::Collect();
}
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 == false)
{
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
Comentários
O ReRegisterForFinalize método adiciona o obj
parâmetro à lista de objetos que solicitam a finalização antes que o coletor de lixo libere o objeto. O obj
parâmetro deve ser o chamador desse método.
Chamar o ReRegisterForFinalize método não garante que o coletor de lixo chame o finalizador de um objeto.
Por padrão, todos os objetos que implementam finalizadores são adicionados à lista de objetos que exigem finalização; no entanto, um objeto pode já ter sido finalizado ou pode ter desabilitado a finalização chamando o SuppressFinalize método .
Um finalizador pode usar esse método para ressuscitar a si mesmo ou um objeto referenciado por ele.