CriticalFinalizerObject Klasa
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Zapewnia, że cały kod finalizacji w klasach pochodnych jest oznaczony jako krytyczny.
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
- Dziedziczenie
-
CriticalFinalizerObject
- Pochodne
- Atrybuty
Przykłady
Poniższy przykład kodu przedstawia użycie klasy w celu zapewnienia krytycznej SafeFileHandle finalizacji standardowych strumieni wejściowych i wyjściowych. Element SafeFileHandle, pochodzący z SafeHandle klasy, jest przekazywany do strumienia plików w konstruktorze 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
Uwagi
Klasy pochodzące z CriticalFinalizerObject klasy są niejawnie traktowane jako ograniczony region wykonywania (CER). Wymaga to kodu w finalizatorze do wywołania kodu tylko z silnym kontraktem niezawodności. Aby uzyskać więcej informacji o programach CERs, zobacz System.Runtime.ConstrainedExecution przestrzeń nazw.
W klasach pochodzących z CriticalFinalizerObject klasy środowisko uruchomieniowe języka wspólnego (CLR) gwarantuje, że cały krytyczny kod finalizacji będzie miał możliwość wykonania, pod warunkiem, że finalizator jest zgodny z regułami cer, nawet w sytuacjach, gdy clR przymusowo zwalnia domenę aplikacji lub przerywa wątku. Jeśli finalizator narusza reguły cer, może nie zostać wykonane pomyślnie. Ponadto CLR ustanawia słabe kolejność wśród normalnych i krytycznych finalizatorów: w przypadku obiektów odzyskanych przez odzyskiwanie pamięci w tym samym czasie, wszystkie niekrytyczne finalizatory są wywoływane przed żadnym z krytycznych finalizatorów. Na przykład klasa, taka jak FileStream, która przechowuje dane w klasie pochodzącej SafeHandle z CriticalFinalizerObjectklasy , może uruchomić standardowy finalizator, aby opróżnić istniejące buforowane dane.
W większości przypadków nie trzeba pisać klas, które pochodzą z CriticalFinalizerObject klasy. Biblioteka klas .NET Framework udostępnia dwie klasy i SafeHandle CriticalHandle, które zapewniają krytyczne funkcje finalizacji dla obsługi zasobów. Ponadto .NET Framework udostępnia zestaw wstępnie napisanych klas pochodnych od SafeHandle klasy, a ten zestaw znajduje się w Microsoft.Win32.SafeHandles przestrzeni nazw. Te klasy zostały zaprojektowane tak, aby zapewnić typowe funkcje obsługi dojść do plików i systemów operacyjnych.
Konstruktory
CriticalFinalizerObject() |
Inicjuje nowe wystąpienie klasy CriticalFinalizerObject. |
Metody
Equals(Object) |
Określa, czy dany obiekt jest taki sam, jak bieżący obiekt. (Odziedziczone po Object) |
Finalize() |
Zwalnia wszystkie zasoby używane przez klasę CriticalFinalizerObject . |
GetHashCode() |
Służy jako domyślna funkcja skrótu. (Odziedziczone po Object) |
GetType() |
Type Pobiera wartość bieżącego wystąpienia. (Odziedziczone po Object) |
MemberwiseClone() |
Tworzy płytkią kopię bieżącego Objectelementu . (Odziedziczone po Object) |
ToString() |
Zwraca ciąg reprezentujący bieżący obiekt. (Odziedziczone po Object) |