CriticalFinalizerObject クラス

定義

派生クラスのすべての最終処理コードがクリティカルとしてマークされていることを確認します。

public ref class CriticalFinalizerObject abstract
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class CriticalFinalizerObject
public abstract class CriticalFinalizerObject
[<System.Runtime.InteropServices.ComVisible(true)>]
type CriticalFinalizerObject = class
type CriticalFinalizerObject = class
Public MustInherit Class CriticalFinalizerObject
継承
CriticalFinalizerObject
派生
属性

次のコード例は、 SafeFileHandle クラスを使用して、標準の入力ストリームと出力ストリームに重要な最終処理を提供する方法を示しています。 SafeHandle クラスから派生したSafeFileHandleは、FileStream コンストラクターのファイル ストリームに渡されます。

using System;
using System.Runtime.InteropServices;
using System.IO;
using Microsoft.Win32.SafeHandles;

namespace CriticalFinalizer
{
    class Program
    {
        const int STD_INPUT_HANDLE   = -10;
        const int STD_OUTPUT_HANDLE = -11;
        const int STD_ERROR_HANDLE  =  -12;
        [DllImport("Kernel32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
        public static extern IntPtr GetStdHandle(int type);

        static void Main(string[] args)
        {
            FileStream fsIn = null;
            FileStream fsOut = null;
            try
            {
                SafeFileHandle sfhIn = new SafeFileHandle(GetStdHandle(STD_INPUT_HANDLE), false);
                fsIn = new FileStream(sfhIn, FileAccess.Read);
                byte[] input = new byte[] {0};
                fsIn.Read(input,0,1);
                SafeFileHandle sfhOut = new SafeFileHandle(GetStdHandle(STD_OUTPUT_HANDLE), false);
                fsOut = new FileStream(sfhOut, FileAccess.Write);
                fsOut.Write(input,0,1);
                SafeFileHandle sf = fsOut.SafeFileHandle;
            }
            finally
            {
                if (fsIn != null)
                {
                    fsIn.Close();
                    fsIn = null;
                }
                if (fsOut != null)
                {
                    fsOut.Close();
                    fsOut = null;
                }
            }
        }
    }
}
Imports System.Runtime.InteropServices
Imports System.IO
Imports Microsoft.Win32.SafeHandles

Public Module Example
   Const STD_INPUT_HANDLE As Integer  = -10
   Const STD_OUTPUT_HANDLE As Integer = -11
   Const STD_ERROR_HANDLE As Integer  = -12

   Public Declare Auto Function GetStdHandle Lib "Kernel32" (type As Integer) As IntPtr

   Public Sub Main()
      Dim fsIn As FileStream = Nothing
      Dim fsOut As FileStream = Nothing

      Try
         Dim sfhIn As New SafeFileHandle(GetStdHandle(STD_INPUT_HANDLE), False)
         fsIn = new FileStream(sfhIn, FileAccess.Read)
         Dim input() As Byte = { 0 }
         fsIn.Read(input, 0, 1)
         Dim sfhOut As New SafeFileHandle(GetStdHandle(STD_OUTPUT_HANDLE), False)
         fsOut = New FileStream(sfhOut, FileAccess.Write)
         fsOut.Write(input, 0, 1)
         Dim sf As SafeFileHandle = fsOut.SafeFileHandle
      Finally
         If fsIn IsNot Nothing Then
            fsIn.Close()
            fsIn = Nothing
         End If
         If fsOut IsNot Nothing Then 
            fsOut.Close()
            fsOut = Nothing
         End If
      End Try
   End Sub
End Module

注釈

CriticalFinalizerObject クラスから派生したクラスは、制約付き実行領域 (CER) として暗黙的に扱われます。 これには、ファイナライザーのコードで、信頼性の高いコントラクトを持つコードのみを呼び出す必要があります。 CER の詳細については、 System.Runtime.ConstrainedExecution 名前空間を参照してください。

CriticalFinalizerObject クラスから派生したクラスでは、CLR がアプリケーション ドメインを強制的にアンロードしたりスレッドを中止したりする場合でも、ファイナライザーが CER の規則に従っている場合でも、共通言語ランタイム (CLR) は、すべての重要なファイナライズ コードに実行の機会が与えられることを保証します。 ファイナライザーが CER の規則に違反すると、正常に実行されない可能性があります。 さらに、CLR は通常のファイナライザーとクリティカル ファイナライザーの間で弱い順序を確立します。ガベージ コレクションによって同時に再利用されるオブジェクトの場合、クリティカルでないファイナライザーはすべて、クリティカル ファイナライザーの前に呼び出されます。 たとえば、CriticalFinalizerObjectから派生したSafeHandle クラス内のデータを保持する FileStream などのクラスは、標準ファイナライザーを実行して、バッファー内の既存のデータをフラッシュできます。

ほとんどの場合、 CriticalFinalizerObject クラスから派生するクラスを記述する必要はありません。 .NET Framework クラス ライブラリには、SafeHandleCriticalHandle という 2 つのクラスが用意されています。このクラスは、リソースを処理するための重要な最終処理機能を提供します。 さらに、.NET Framework には、SafeHandle クラスから派生した一連の事前書き込みクラスが用意されており、このセットは Microsoft.Win32.SafeHandles 名前空間にあります。 これらのクラスは、ファイルとオペレーティング システムのハンドルをサポートするための一般的な機能を提供するように設計されています。

コンストラクター

名前 説明
CriticalFinalizerObject()

CriticalFinalizerObject クラスの新しいインスタンスを初期化します。

メソッド

名前 説明
Equals(Object)

指定したオブジェクトが現在のオブジェクトと等しいかどうかを判断します。

(継承元 Object)
Finalize()

CriticalFinalizerObject クラスによって使用されるすべてのリソースを解放します。

GetHashCode()

既定のハッシュ関数として機能します。

(継承元 Object)
GetType()

現在のインスタンスの Type を取得します。

(継承元 Object)
MemberwiseClone()

現在の Objectの簡易コピーを作成します。

(継承元 Object)
ToString()

現在のオブジェクトを表す文字列を返します。

(継承元 Object)

適用対象

こちらもご覧ください