C#管理対象リソースと非管理対象リソース(参照7)

この記事は次から転送されます:https://docs.microsoft.com/zh-cn/dotnet/api/system.gc.suppressfinalize?redirectedfrom=MSDN&view=netframework-4.8#System_GC_SuppressFinalize_System_Object_

共通言語ランタイムを要求するときに、指定されたオブジェクトのファイナライザを呼び出さないでください。

C#
public static void SuppressFinalize (object obj);

パラメータ

obj
対象

ターミネータを実行してはならないオブジェクト。

例外

obj のために  null

次の例は、リソースクラスでSuppressFinalize  メソッドを使用して、冗長なガベージコレクションが呼び出されないようにする方法を示しています  。 この例では、破棄モード使用して、マネージリソース(つまりIDisposableを実装するオブジェクト)およびアンマネージリソースを解放し  ます

C#
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 destructor calls Object.Finalize. ~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."); } // Call Dispose with disposing = false. Dispose(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(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. 

コメント

このメソッドはobj、ファイナライザーが呼び出されたときに実行時にチェックされるオブジェクトヘッダーにビットを設定  します。 Object.Finalize  メソッドで表される  ファイナライザは、オブジェクトのガベージコレクションの前にアンマネージリソースを解放するために使用されます。  ファイナライザがない場合、またはGCがファイナライザスレッドにファイナライザを実行するようシグナルを送った場合  、  SuppressFinalize  メソッドの呼び出しは効果がありません。obj

IDisposable  インターフェイスを実装する  オブジェクトは、オブジェクトのIDisposable.Dispose  実装から  このメソッドを呼び出して、不要なオブジェクトでガベージコレクターがObject.Finalizeを呼び出さないようにすることができます  。 通常、これは、ファイナライザがIDisposable.Disposeによって解放された アンマネージリソースを解放しないようにするために行われ  ます。

に適用する

。ネット

5プレビュー1

.NET Core

3.1  3.0  2.2  2.1  2.0  1.1  1.0

。ネットフレームワーク

4.8  4.7.2  4.7.1  4.7  4.6.2  4.6.1  4.6  4.5.2  4.5.1  4.5  4.0  3.5  3.0  2.0  1.1

.NET標準

2.1  2.0  1.6  1.5  1.4  1.3  1.2  1.1  1.0

UWP

10.0

Xamarin.Android

7.1

Xamarin.iOS

10.8

YourName

3.0

おすすめ

転載: www.cnblogs.com/hanguoshun/p/12738238.html