GC.ReRegisterForFinalize(Object) 메서드

정의

시스템이 이전에 호출된 지정된 개체의 종료자를 호출하도록 요청합니다 SuppressFinalize(Object) .

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)

매개 변수

obj
Object

종료자를 호출해야 하는 개체입니다.

예외

objnull입니다.

예제

다음 예제에서는 메서드를 사용 하 여 ReRegisterForFinalize 가비지 수집 후 두 번째로 개체를 마무리 하는 방법을 보여 줍니다.

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

설명

이 메서드는 ReRegisterForFinalize 가비지 수집기가 개체를 해제하기 전에 종료를 요청하는 개체 목록에 매개 변수를 추가 obj 합니다. 매개 변수는 obj 이 메서드의 호출자여야 합니다.

메서드를 ReRegisterForFinalize 호출해도 가비지 수집기가 개체의 종료자를 호출한다고 보장할 수 없습니다.

기본적으로 종료자를 구현하는 모든 개체는 종료가 필요한 개체 목록에 추가됩니다. 그러나 개체가 이미 종료되었거나 메서드를 호출 SuppressFinalize 하여 종료를 사용하지 않도록 설정했을 수 있습니다.

종료자는 이 메서드를 사용하여 자체 또는 참조하는 개체를 부활할 수 있습니다.

적용 대상

추가 정보