簡體   English   中英

IDisposable 模式,SafeFileHandle 是非托管資源嗎?

[英]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上的方法之一)。

SafeFileHandleSafeHandle的子類,它是一種專門用於包裝非托管資源的類型。 SafeHandle定義了自己的終結器,它在必要時以合適的方式釋放非托管資源。


最好不要擁有自己的非托管資源,而是始終使用SafeHandle / CriticalFinalizerObject子類來管理它們。

這避免了一個大的 P/Invoke 陷阱,也意味着你不必在你的代碼中實現完整的IDisposable模式:你只需要定義一個Dispose()方法,它在你的SafeHandles上調用Dispose() ,並且不要不需要實現終結器。

(有些人可能出於性能原因需要偏離這一點,但這些人很少見)


1除了unmanaged約束的通用類型...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM