Share via


GC.ReRegisterForFinalize メソッド

SuppressFinalize が既に呼び出されている指定オブジェクトに対して、ファイナライザ メソッドを呼び出すことをシステムに要求します。

Public Shared Sub ReRegisterForFinalize( _
   ByVal obj As Object _)
[C#]
public static void ReRegisterForFinalize(objectobj);
[C++]
public: static void ReRegisterForFinalize(Object* obj);
[JScript]
public static function ReRegisterForFinalize(
   obj : Object);

パラメータ

  • obj
    ファイナライザの呼び出しが必要なオブジェクト。

例外

例外の種類 条件
ArgumentNullException obj が null 参照 (Visual Basic では Nothing) です。

解説

ReRegisterForFinalize メソッドは、ガベージ コレクタがオブジェクトを解放する前に、終了操作を要求するオブジェクトのリストに obj を追加します。 obj パラメータには、このメソッドの呼び出し元を指定する必要があります。

ReRegisterForFinalize メソッドを呼び出しても、ガベージ コレクタがオブジェクトのファイナライザを呼び出すという保証はありません。

既定では、ファイナライザを実装するすべてのオブジェクトは、終了操作を要求をするオブジェクトのリストに追加されます。ただし、オブジェクトが既に終了されている場合や、 SuppressFinalize メソッドを呼び出すことにより終了操作が無効にされている場合などがあります。

ファイナライザは、このメソッドを使用して、それ自身またはそれが参照するオブジェクトを復活させることができます。

使用例

 
Imports System

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

[C#] 
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");
            }
        }
    }
}

[C++] 
#using <mscorlib.dll>

using namespace System;

__gc class MyFinalizeObject {
public:
   static MyFinalizeObject* currentInstance = 0;
private:
   bool  hasFinalized;
public:
   MyFinalizeObject() {
      hasFinalized = false;
   }
   ~MyFinalizeObject() {
      if (hasFinalized == false) {
         Console::WriteLine(S"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(S"Second finalization");
      }
   }
};

int main() {
   // Create a MyFinalizeObject.
   MyFinalizeObject* mfo = new MyFinalizeObject();

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

   // 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 = 0;
   GC::Collect();
}

[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン 言語のフィルタ をクリックします。

必要条件

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ, .NET Compact Framework - Windows CE .NET, Common Language Infrastructure (CLI) Standard

参照

GC クラス | GC メンバ | System 名前空間 | SuppressFinalize