GC.SuppressFinalize(Object) 方法  
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
请求公共语言运行时不要调用指定对象的终结器。
public:
 static void SuppressFinalize(System::Object ^ obj);public static void SuppressFinalize(object obj);static member SuppressFinalize : obj -> unitPublic Shared Sub SuppressFinalize (obj As Object)参数
- obj
- Object
不得执行其终结器的对象。
例外
              obj 为 null。
示例
以下示例演示如何使用 SuppressFinalize 资源类中的 方法来防止调用冗余垃圾回收。 该示例使用 释放模式 释放托管资源 (即实现 IDisposable) 和非托管资源的对象。
using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
public class ConsoleMonitor : IDisposable
{
   const int STD_INPUT_HANDLE = -10;
   const int STD_OUTPUT_HANDLE = -11;
   const int STD_ERROR_HANDLE = -12;
   [DllImport("kernel32.dll", SetLastError = true)]
   static extern IntPtr GetStdHandle(int nStdHandle);
   [DllImport("kernel32.dll", SetLastError = true)]
   static extern bool WriteConsole(IntPtr hConsoleOutput, string lpBuffer,
          uint nNumberOfCharsToWrite, out uint lpNumberOfCharsWritten,
          IntPtr lpReserved);
   [DllImport("kernel32.dll", SetLastError = true)]
   static extern bool CloseHandle(IntPtr handle);
   private bool disposed = false;
   private IntPtr handle;
   private Component component;
   public ConsoleMonitor()
   {
      handle = GetStdHandle(STD_OUTPUT_HANDLE);
      if (handle == IntPtr.Zero)
         throw new InvalidOperationException("A console handle is not available.");
      component = new Component();
      string output = "The ConsoleMonitor class constructor.\n";
      uint written = 0;
      WriteConsole(handle, output, (uint) output.Length, out written, IntPtr.Zero);
   }
   // The finalizer represents Object.Finalize override.
   ~ConsoleMonitor()
   {
      if (handle != IntPtr.Zero) {
         string output = "The ConsoleMonitor finalizer.\n";
         uint written = 0;
         WriteConsole(handle, output, (uint) output.Length, out written, IntPtr.Zero);
      }
      else {
         Console.Error.WriteLine("Object finalization.");
      }
      Dispose(disposing: false);
   }
   public void Write()
   {
      string output = "The Write method.\n";
      uint written = 0;
      WriteConsole(handle, output, (uint) output.Length, out written, IntPtr.Zero);
   }
   public void Dispose()
   {
      string output = "The Dispose method.\n";
      uint written = 0;
      WriteConsole(handle, output, (uint) output.Length, out written, IntPtr.Zero);
      Dispose(disposing: true);
      GC.SuppressFinalize(this);
   }
   private void Dispose(bool disposing)
   {
      string output = String.Format("The Dispose({0}) method.\n", disposing);
      uint written = 0;
      WriteConsole(handle, output, (uint) output.Length, out written, IntPtr.Zero);
      // Execute if resources have not already been disposed.
      if (!disposed) {
         // If the call is from Dispose, free managed resources.
         if (disposing) {
            Console.Error.WriteLine("Disposing of managed resources.");
            if (component != null)
               component.Dispose();
         }
         // Free unmanaged resources.
         output = "Disposing of unmanaged resources.";
         WriteConsole(handle, output, (uint) output.Length, out written, IntPtr.Zero);
         if (handle != IntPtr.Zero) {
            if (!CloseHandle(handle))
               Console.Error.WriteLine("Handle cannot be closed.");
         }
      }
      disposed = true;
   }
}
public class Example
{
   public static void Main()
   {
      Console.WriteLine("ConsoleMonitor instance....");
      ConsoleMonitor monitor = new ConsoleMonitor();
      monitor.Write();
      monitor.Dispose();
   }
}
// If the monitor.Dispose method is not called, the example displays the following output:
//       ConsoleMonitor instance....
//       The ConsoleMonitor class constructor.
//       The Write method.
//       The ConsoleMonitor finalizer.
//       The Dispose(False) method.
//       Disposing of unmanaged resources.
//
// If the monitor.Dispose method is called, the example displays the following output:
//       ConsoleMonitor instance....
//       The ConsoleMonitor class constructor.
//       The Write method.
//       The Dispose method.
//       The Dispose(True) method.
//       Disposing of managed resources.
//       Disposing of unmanaged resources.
open System
open System.ComponentModel
open System.Runtime.InteropServices
[<DllImport("kernel32.dll", SetLastError = true)>]
extern IntPtr GetStdHandle(int nStdHandle)
[<DllImport("kernel32.dll", SetLastError = true)>]
extern bool WriteConsole(IntPtr hConsoleOutput, string lpBuffer, uint nNumberOfCharsToWrite, uint& lpNumberOfCharsWritten, IntPtr lpReserved)
[<DllImport("kernel32.dll", SetLastError = true)>]
extern bool CloseHandle(IntPtr handle)
type ConsoleMonitor() =
    let STD_INPUT_HANDLE = -10
    let STD_OUTPUT_HANDLE = -11
    let STD_ERROR_HANDLE = -12
    let handle =
        let h = GetStdHandle STD_OUTPUT_HANDLE
        if h = IntPtr.Zero then
            raise (InvalidOperationException "A console handle is not available.")
        else
            h
    let comp = new Component()
    let output = "The ConsoleMonitor class constructor.\n"
    let mutable disposed = false
    let mutable written = 0u
    do
        WriteConsole(handle, output, uint output.Length, &written, IntPtr.Zero)
        |> ignore
    // The finalizer represents Object.Finalize override.
    override this.Finalize() =
        if handle <> IntPtr.Zero then
            let output = "The ConsoleMonitor finalizer.\n"
            let mutable written = 0u
            WriteConsole(handle, output, uint output.Length, &written, IntPtr.Zero)
            |> ignore
        else
            eprintfn "Object finalization."
        this.Dispose false
    member _.Write() =
        let output = "The Write method.\n"
        let mutable written = 0u
        WriteConsole(handle, output, uint output.Length, &written, IntPtr.Zero)
        |> ignore
    member _.Dispose(disposing: bool) =
        let output = $"The Dispose({disposing}) method.\n"
        let mutable written = 0u
        WriteConsole(handle, output, uint output.Length, &written, IntPtr.Zero)
        |> ignore
        // Execute if resources have not already been disposed.
        if not disposed then
            // If the call is from Dispose, free managed resources.
            if disposing then
                eprintfn "Disposing of managed resources."
                if comp <> null then comp.Dispose()
            // Free unmanaged resources.
            let output = "Disposing of unmanaged resources."
            WriteConsole(handle, output, uint output.Length, &written, IntPtr.Zero)
            |> ignore
            if handle <> IntPtr.Zero then
                if not (CloseHandle handle) then
                    eprintfn "Handle cannot be closed."
        disposed <- true
    member this.Dispose() =
        let output = "The Dispose method.\n"
        let mutable written = 0u
        WriteConsole(handle, output, uint output.Length, &written, IntPtr.Zero)
        |> ignore
        this.Dispose true
        GC.SuppressFinalize this
    interface IDisposable with
        member this.Dispose() = this.Dispose()
printfn "ConsoleMonitor instance...."
let monitor = new ConsoleMonitor()
monitor.Write()
monitor.Dispose()
// If the monitor.Dispose method is not called, the example displays the following output:
//       ConsoleMonitor instance....
//       The ConsoleMonitor class constructor.
//       The Write method.
//       The ConsoleMonitor finalizer.
//       The Dispose(False) method.
//       Disposing of unmanaged resources.
//
// If the monitor.Dispose method is called, the example displays the following output:
//       ConsoleMonitor instance....
//       The ConsoleMonitor class constructor.
//       The Write method.
//       The Dispose method.
//       The Dispose(True) method.
//       Disposing of managed resources.
//       Disposing of unmanaged resources.
Imports System.ComponentModel
Imports System.Runtime.InteropServices
Public Class ConsoleMonitor
   Private Const STD_INPUT_HANDLE As Integer = -10
   Private Const STD_OUTPUT_HANDLE As Integer = -11
   Private Const STD_ERROR_HANDLE As Integer = -12
   Private Declare Function GetStdHandle Lib "kernel32" _
                            (nStdHandle As Integer) As IntPtr
   Private Declare Function WriteConsole Lib "kernel32" _
                            Alias "WriteConsoleA" _
                            (hConsoleOutput As IntPtr, lpBuffer As String,
                            nNumberOfCharsToWrite As UInteger,
                            ByRef lpNumberOfCharsWritten As UInteger,
                            lpReserved As IntPtr) As Boolean
   Private Declare Function CloseHandle Lib "kernel32" _
                           (handle As IntPtr) As Boolean
   Private disposed As Boolean = False
   Private handle As IntPtr
   Private component As Component
   Public Sub New()
      handle = GetStdHandle(STD_OUTPUT_HANDLE)
      If handle = IntPtr.Zero Then
         Throw New InvalidOperationException("A console handle is not available.")
      End If
      component = new Component()
      Dim output As String = "The ConsoleMonitor class constructor." + vbCrLf
      Dim written As UInteger = 0
      WriteConsole(handle, output, CUInt(output.Length), written, IntPtr.Zero)
   End Sub
   Protected Overrides Sub Finalize()
      If handle <> IntPtr.Zero Then
         Dim output As String = "The ConsoleMonitor finalizer." + vbCrLf
         Dim written As UInteger = 0
         WriteConsole(handle, output, CUInt(output.Length), written, IntPtr.Zero)
      Else
         Console.Error.WriteLine("Object finalization.")
      End If
      Dispose(disposing:=False)
   End Sub
   Public Sub Write()
      Dim output As String = "The Write method." + vbCrLf
      Dim written As UInteger = 0
      WriteConsole(handle, output, CUInt(output.Length), written, IntPtr.Zero)
   End Sub
   Public Sub Dispose()
      Dim output As String =  "The Dispose method." + vbCrLf
      Dim written As UInteger = 0
      WriteConsole(handle, output, CUInt(output.Length), written, IntPtr.Zero)
      Dispose(disposing:=True)
      GC.SuppressFinalize(Me)
   End Sub
   Private Sub Dispose(disposing As Boolean)
      Dim output As String =  String.Format("The Dispose({0}) method.{1}",
                                            disposing, vbCrLf)
      Dim written As UInteger = 0
      WriteConsole(handle, output, CUInt(output.Length), written, IntPtr.Zero)
      ' Execute if resources have not already been disposed.
      If Not disposed Then
         ' If the call is from Dispose, free managed resources.
         If disposing Then
            Console.Error.WriteLine("Disposing of managed resources.")
            If component IsNot Nothing Then component.Dispose()
         End If
         ' Free unmanaged resources.
         output = "Disposing of unmanaged resources."
         WriteConsole(handle, output, CUInt(output.Length), written, IntPtr.Zero)
         If handle <> IntPtr.Zero Then
            If Not CloseHandle(handle) Then
               Console.Error.WriteLine("Handle cannot be closed.")
            End If
         End If
      End If
      disposed = True
   End Sub
End Class
Module Example
   Public Sub Main()
      Console.WriteLine("ConsoleMonitor instance....")
      Dim monitor As New ConsoleMonitor
      monitor.Write()
      monitor.Dispose()
   End Sub
End Module
' If the monitor.Dispose method is not called, the example displays the following output:
'       ConsoleMonitor instance....
'       The ConsoleMonitor class constructor.
'       The Write method.
'       The ConsoleMonitor finalizer.
'       The Dispose(False) method.
'       Disposing of unmanaged resources.
'
' If the monitor.Dispose method is called, the example displays the following output:
'       ConsoleMonitor instance....
'       The ConsoleMonitor class constructor.
'       The Write method.
'       The Dispose method.
'       The Dispose(True) method.
'       Disposing of managed resources.
'       Disposing of unmanaged resources.
注解
此方法在 的对象标头 obj中设置一个位,运行时在调用终结器时会检查该位。 终结器(由 Object.Finalize 方法表示)用于在对对象进行垃圾回收之前释放非托管资源。
如果没有 obj 终结器或 GC 已向终结器线程发出信号以运行终结器,则对 方法的 SuppressFinalize 调用不起作用。
实现 IDisposable 接口的对象可以从对象的 IDisposable.Dispose 实现中调用此方法,以防止垃圾回收器对不需要它的对象调用 Object.Finalize 此方法。 通常,这样做是为了防止终结器释放已由 IDisposable.Dispose 实现释放的非托管资源。