Sdílet prostřednictvím


CriticalFinalizerObject Třída

Definice

Zajišťuje, že veškerý kód finalizace v odvozených třídách je označen jako kritický.

public ref class CriticalFinalizerObject abstract
public abstract class CriticalFinalizerObject
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class CriticalFinalizerObject
type CriticalFinalizerObject = class
[<System.Runtime.InteropServices.ComVisible(true)>]
type CriticalFinalizerObject = class
Public MustInherit Class CriticalFinalizerObject
Dědičnost
CriticalFinalizerObject
Odvozené
Atributy

Příklady

Následující příklad kódu ukazuje použití SafeFileHandle třídy k zajištění kritické finalizace pro standardní vstupní a výstupní datové proudy. , SafeFileHandleodvozený z SafeHandle třídy , je předán do datového proudu souboru v konstruktoru 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

Poznámky

Třídy odvozené z CriticalFinalizerObject třídy jsou implicitně považovány za oblast omezeného provádění (CER). To vyžaduje, aby kód v finalizačním procesu volal pouze kód se silným kontraktem spolehlivosti. Další informace o CER najdete v System.Runtime.ConstrainedExecution tématu obor názvů.

Ve třídách odvozených z CriticalFinalizerObject třídy common language runtime (CLR) zaručuje, že všechny kritické finalizační kódy budou mít možnost provést, za předpokladu, že finalizační proces dodržuje pravidla pro CER, a to i v situacích, kdy CLR vynuceně uvolní doménu aplikace nebo přeruší vlákno. Pokud finalizační procedura porušuje pravidla pro cer, nemusí se úspěšně spustit. Kromě toho CLR stanoví slabé pořadí mezi normálními a kritickými finalizátory: pro objekty uvolněné uvolňováním paměti ve stejnou dobu jsou všechny nekritické finalizační metody volána před jakoukoli kritickou finalizační metodou. Například třída , FileStreamjako je , která obsahuje data ve SafeHandle třídě odvozené z CriticalFinalizerObject, může spustit standardní finalizační metodu pro vyprázdnění existujících dat ve vyrovnávací paměti.

Ve většině případů není nutné psát třídy, které jsou odvozeny CriticalFinalizerObject z třídy . Knihovna tříd rozhraní .NET Framework poskytuje dvě třídy, SafeHandle a CriticalHandle, které poskytují kritické finalizační funkce pro zpracování prostředků. Kromě toho rozhraní .NET Framework poskytuje sadu předpsaných tříd odvozených z SafeHandle třídy a tato sada se nachází v Microsoft.Win32.SafeHandles oboru názvů . Tyto třídy jsou navrženy tak, aby poskytovaly běžné funkce pro podporu souborů a popisovačů operačního systému.

Konstruktory

CriticalFinalizerObject()

Inicializuje novou instanci CriticalFinalizerObject třídy .

Metody

Equals(Object)

Určí, zda se zadaný objekt rovná aktuálnímu objektu.

(Zděděno od Object)
Finalize()

Uvolní všechny prostředky používané CriticalFinalizerObject třídou .

GetHashCode()

Slouží jako výchozí hashovací funkce.

(Zděděno od Object)
GetType()

Type Získá z aktuální instance.

(Zděděno od Object)
MemberwiseClone()

Vytvoří mělkou kopii aktuálního Objectsouboru .

(Zděděno od Object)
ToString()

Vrátí řetězec, který představuje aktuální objekt.

(Zděděno od Object)

Platí pro

Viz také