GC.SuppressFinalize メソッド

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

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

パラメータ

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

例外

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

解説

このメソッドは、終了操作を要求するオブジェクトのセットから obj を削除します。 obj パラメータには、このメソッドの呼び出し元を指定する必要があります。

IDisposable インターフェイスを実装するオブジェクトは、 IDisposable.Dispose メソッドからこのメソッドを呼び出すことで、ガベージ コレクションが不要なオブジェクトに対してガベージ コレクタが Object.Finalize を呼び出すのを防止できます。

使用例

 
Imports System
Imports System.ComponentModel

' The following example demonstrates how to use the 
' GC.SuppressFinalize method in a resource class to prevent
' the clean-up code for the object from being called twice.
Public Class DisposeExample

   ' A class that implements IDisposable.
   ' By implementing IDisposable, you are announcing that 
   ' instances of this type allocate scarce resources.
   Public Class MyResource
      Implements IDisposable
      ' Pointer to an external unmanaged resource.
      Private handle As IntPtr
      ' Other managed resource this class uses.
      Private component As Component
      ' Track whether Dispose has been called.
      Private disposed As Boolean = False


      ' The class constructor initializes the handle and component.
      Public Sub New(ByVal handle As IntPtr)
         Me.handle = handle
      End Sub


      ' Implement IDisposable.
      ' Do not make this method virtual.
      ' A derived class should not be able to override this method.
      Public Overloads Sub Dispose() Implements IDisposable.Dispose
         Dispose(True)
         ' This object will be cleaned up by the Dispose method.
         ' Therefore, you should call GC.SupressFinalize to
         ' take this object off the finalization queue 
         ' and prevent finalization code for this object
         ' from executing a second time.
         GC.SuppressFinalize(Me)
      End Sub

      ' Dispose(bool disposing) executes in two distinct scenarios.
      ' If disposing equals true, the method has been called directly
      ' or indirectly by a user's code. Managed and unmanaged resources
      ' can be disposed.
      ' If disposing equals false, the method has been called by the 
      ' runtime from inside the finalizer and you should not reference 
      ' other objects. Only unmanaged resources can be disposed.
      Private Overloads Sub Dispose(ByVal disposing As Boolean)
         ' Check to see if Dispose has already been called.
         If Not Me.disposed Then
            ' If disposing equals true, dispose all managed 
            ' and unmanaged resources.
            If disposing Then
               ' Dispose managed resources.
               component.Dispose()
            End If

            ' Call the appropriate methods to clean up 
            ' unmanaged resources here.
            ' If disposing is false, 
            ' only the following code is executed.
            CloseHandle(handle)
            handle = IntPtr.Zero
         End If
         disposed = True
      End Sub

      ' Use interop to call the method necessary  
      ' to clean up the unmanaged resource.
      <System.Runtime.InteropServices.DllImport("Kernel32")> _
      Private Shared Function CloseHandle(ByVal handle As IntPtr) As [Boolean]
      End Function

      ' This finalizer will run only if the Dispose method 
      ' does not get called.
      ' It gives your base class the opportunity to finalize.
      ' Do not provide finalize methods in types derived from this class.
      Protected Overrides Sub Finalize()
         ' Do not re-create Dispose clean-up code here.
         ' Calling Dispose(false) is optimal in terms of
         ' readability and maintainability.
         Dispose(False)
         MyBase.Finalize()
      End Sub
   End Class

Public Shared Sub Main()
   ' Insert code here to create
   ' and use a MyResource object.
End Sub
End Class

[C#] 
using System;
using System.ComponentModel;

// The following example demonstrates how to use the 
// GC.SuppressFinalize method in a resource class to prevent
// the clean-up code for the object from being called twice.

public class DisposeExample
{
    // A class that implements IDisposable.
    // By implementing IDisposable, you are announcing that 
    // instances of this type allocate scarce resources.
    public class MyResource: IDisposable
    {
        // Pointer to an external unmanaged resource.
        private IntPtr handle;
        // Other managed resource this class uses.
        private Component component = new Component();
        // Track whether Dispose has been called.
        private bool disposed = false;

        // The class constructor.
        public MyResource(IntPtr handle)
        {
            this.handle = handle;
        }

        // Implement IDisposable.
        // Do not make this method virtual.
        // A derived class should not be able to override this method.
        public void Dispose()
        {
            Dispose(true);
            // This object will be cleaned up by the Dispose method.
            // Therefore, you should call GC.SupressFinalize to
            // take this object off the finalization queue 
            // and prevent finalization code for this object
            // from executing a second time.
            GC.SuppressFinalize(this);
        }

        // Dispose(bool disposing) executes in two distinct scenarios.
        // If disposing equals true, the method has been called directly
        // or indirectly by a user's code. Managed and unmanaged resources
        // can be disposed.
        // If disposing equals false, the method has been called by the 
        // runtime from inside the finalizer and you should not reference 
        // other objects. Only unmanaged resources can be disposed.
        private void Dispose(bool disposing)
        {
            // Check to see if Dispose has already been called.
            if(!this.disposed)
            {
                // If disposing equals true, dispose all managed 
                // and unmanaged resources.
                if(disposing)
                {
                    // Dispose managed resources.
                    component.Dispose();
                }
         
                // Call the appropriate methods to clean up 
                // unmanaged resources here.
                // If disposing is false, 
                // only the following code is executed.
                CloseHandle(handle);
                handle = IntPtr.Zero;            
            }
            disposed = true;         
        }

        // Use interop to call the method necessary  
        // to clean up the unmanaged resource.
        [System.Runtime.InteropServices.DllImport("Kernel32")]
        private extern static Boolean CloseHandle(IntPtr handle);

        // Use C# destructor syntax for finalization code.
        // This destructor will run only if the Dispose method 
        // does not get called.
        // It gives your base class the opportunity to finalize.
        // Do not provide destructors in types derived from this class.
        ~MyResource()      
        {
            // Do not re-create Dispose clean-up code here.
            // Calling Dispose(false) is optimal in terms of
            // readability and maintainability.
            Dispose(false);
        }
    }

    public static void Main()
    {
        // Insert code here to create
        // and use a MyResource object.
    }
}

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

using namespace System;
using namespace System::ComponentModel;

// The following example demonstrates how to use the
// GC::SuppressFinalize method in a resource class to prevent
// the clean up code for the object from being called twice.

// A class that implements IDisposable.
// By implementing IDisposable, you are announcing that
// instances of this type allocate scarce resources.
public __gc class MyResource : public IDisposable {
   // Pointer to an external unmanaged resource.
private:
   IntPtr handle;
   // Other managed resource this class uses.
   Component*  component;
   // Track whether Dispose has been called.
   bool  disposed;

public:
   // The class constructor.
   MyResource(IntPtr handle) {
      this->handle = handle;
      disposed = false;
   }

   // Implement IDisposable.
   // Do not make this method virtual.
   // A derived class should not be able to  this method.
   void Dispose() {
      Dispose(true);
      // This object will be cleaned up by the Dispose method.
      // Therefore, you should call GC::SupressFinalize to
      // take this object off the finalization queue
      // and prevent finalization code for this object
      // from executing a second time.
      GC::SuppressFinalize(this);
   }

private:
   // Dispose(bool disposing) executes in two distinct scenarios.
   // If disposing equals true, the method has been called directly
   // or indirectly by a user's code. Managed and unmanaged resources
   // can be disposed.
   // If disposing equals false, the method has been called by the
   // runtime from inside the finalizer and you should not reference
   // other objects. Only unmanaged resources can be disposed.
   void Dispose(bool disposing) {
      // Check to see if Dispose has already been called.
      if (!this->disposed) {
         // If disposing equals true, dispose all managed
         // and unmanaged resources.
         if (disposing) {
            // Dispose managed resources.
            component->Dispose();
         }

         // Call the appropriate methods to clean up
         // unmanaged resources here.
         // If disposing is false,
         // only the following code is executed.
         CloseHandle(handle);
         handle = IntPtr::Zero;
      }
      disposed = true;
   }

   // Use interop to call the method necessary
   // to clean up the unmanaged resource.
   [System::Runtime::InteropServices::DllImport(S"Kernel32")]
   static Boolean CloseHandle(IntPtr handle);

   // Use C# destructor syntax for finalization code.
   // This destructor will run only if the Dispose method
   // does not get called.
   // It gives your base class the opportunity to finalize.
   // Do not provide destructors in types derived from this class.
   ~MyResource() {
      // Do not re-create Dispose clean-up code here.
      // Calling Dispose(false) is optimal in terms of
      // readability and maintainability.
      Dispose(false);
   }
};

[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 名前空間 | ReRegisterForFinalize