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