CriticalFinalizerObject 类

定义

确保派生类中的所有终止代码均标记为关键。

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
继承
CriticalFinalizerObject
派生
属性

示例

下面的代码示例演示如何使用 SafeFileHandle 类为标准输入和输出流提供关键终结。 SafeFileHandle派生自 类的 SafeHandle 传递到构造函数中的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 在正常终结器和关键终结器之间建立弱排序:对于同时由垃圾回收回收的对象,所有非关键终结器都会在任何关键终结器之前调用。 例如,类(如 FileStream)在派生自 CriticalFinalizerObject的类中SafeHandle保存数据,可以运行标准终结器来刷新现有的缓冲数据。

在大多数情况下,不需要编写派生自 类的 CriticalFinalizerObject 类。 .NET Framework 类库提供两个类: SafeHandleCriticalHandle,为句柄资源提供关键的终结功能。 此外,.NET Framework提供一组派生自 SafeHandle 类的预写类,此集位于 命名空间中Microsoft.Win32.SafeHandles。 这些类旨在提供用于支持文件和操作系统句柄的常见功能。

构造函数

CriticalFinalizerObject()

初始化 CriticalFinalizerObject 类的新实例。

方法

Equals(Object)

确定指定对象是否等于当前对象。

(继承自 Object)
Finalize()

释放 CriticalFinalizerObject 类使用的所有资源。

GetHashCode()

作为默认哈希函数。

(继承自 Object)
GetType()

获取当前实例的 Type

(继承自 Object)
MemberwiseClone()

创建当前 Object 的浅表副本。

(继承自 Object)
ToString()

返回表示当前对象的字符串。

(继承自 Object)

适用于

另请参阅