[英]IDisposable, Finalizers and the definition of an unmanaged resource
[英]IDisposable pattern, is SafeFileHandle an unmanaged resource?
以下是 Resharper 生成的IDisposable
模式片段:
[NotNull]
private SafeFileHandle Handle { get; }
#region IDisposable
private bool IsDisposed { get; set; }
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void ReleaseUnmanagedResources()
{
// TODO release unmanaged resources here
}
private void Dispose(bool disposing)
{
if (IsDisposed)
return;
ReleaseUnmanagedResources();
if (disposing)
Handle.Dispose();
IsDisposed = true;
}
~Whatever()
{
Dispose(false);
}
Resharper 將SafeFileHandle
視為托管資源,但此句柄與非托管資源 ( CreateFile
) 有關。
題:
SafeFileHandle
將其視為托管資源還是非托管資源?
所有 C# 類和結構都是托管資源1 。
非托管資源通常由IntPtr
或類似的東西指向。 你通常需要做一些非常深思熟慮的事情來得到你的手(例如 P/Invoking 一些本地方法,或使用Marshal
上的方法之一)。
SafeFileHandle
是SafeHandle
的子類,它是一種專門用於包裝非托管資源的類型。 SafeHandle
定義了自己的終結器,它在必要時以合適的方式釋放非托管資源。
最好不要擁有自己的非托管資源,而是始終使用SafeHandle
/ CriticalFinalizerObject
子類來管理它們。
這避免了一個大的 P/Invoke 陷阱,也意味着你不必在你的代碼中實現完整的IDisposable
模式:你只需要定義一個Dispose()
方法,它在你的SafeHandles
上調用Dispose()
,並且不要不需要實現終結器。
(有些人可能出於性能原因需要偏離這一點,但這些人很少見)
1除了unmanaged
約束的通用類型...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.