代码之家  ›  专栏  ›  技术社区  ›  aybe

IDisposable模式,SafeFileHandle是非托管资源吗?

  •  0
  • aybe  · 技术社区  · 5 年前

    IDisposable 由Resharper生成的模式:

    [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);
    }
    

    雷斯哈珀认为 SafeFileHandle CreateFile ).

    应该 安全文件句柄

    1 回复  |  直到 5 年前
        1
  •  1
  •   canton7    5 年前

    所有C类和结构都是托管资源 1个

    非托管资源通常由 IntPtr ,或类似的东西。您通常需要做一些非常慎重的事情来获得一个(例如P/调用一些本机方法,或者使用 Marshal ).

    SafeFileHandle SafeHandle ,这是专门用来包装非托管资源的类型。 安全手柄 定义自己的终结器,必要时以适当的方式释放非托管资源。


    从未 总是 使用 / CriticalFinalizerObject 子类来管理它们。

    这避免了一个很大的P/Invoke陷阱,也意味着您不必实现完整的 IDisposable 代码中的模式:您只需要定义 Dispose() 调用的方法 关于你的 SafeHandles

    (有些人可能因为表演的原因而需要偏离这一点,但这些人很少)


    1个 unmanaged 把约束放在一边。。。