CriticalFinalizerObject 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
确保派生类中的所有最终化代码都标记为关键。
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 类为标准输入和输出流提供关键最终化。 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 在正常终结器和关键终结器之间建立弱排序:对于垃圾回收同时回收的对象,在任一关键终结器之前调用所有非关键终结器。 例如,在派生自CriticalFinalizerObject的类中SafeHandle保存数据的类FileStream可以运行标准终结器来刷新现有缓冲数据。
在大多数情况下,无需编写派生自该类的 CriticalFinalizerObject 类。 .NET Framework 类库提供两个类,即 SafeHandle 和 CriticalHandle,这些类为处理资源提供关键最终化功能。 此外,.NET Framework 提供了一组派生自 SafeHandle 类的预写类,并且此集位于 Microsoft.Win32.SafeHandles 命名空间中。 这些类旨在提供支持文件和操作系统句柄的常见功能。
构造函数
| 名称 | 说明 |
|---|---|
| CriticalFinalizerObject() |
初始化 CriticalFinalizerObject 类的新实例。 |
方法
| 名称 | 说明 |
|---|---|
| Equals(Object) |
确定指定的对象是否等于当前对象。 (继承自 Object) |
| Finalize() |
释放类使用 CriticalFinalizerObject 的所有资源。 |
| GetHashCode() |
用作默认哈希函数。 (继承自 Object) |
| GetType() |
获取当前实例的 Type。 (继承自 Object) |
| MemberwiseClone() |
创建当前 Object的浅表副本。 (继承自 Object) |
| ToString() |
返回一个表示当前对象的字符串。 (继承自 Object) |