使用托管C+;时正确使用IDisposable模式+;C中的包装器# 我的C类创建并使用了管理(C++)对象,它封装(分配和使用)非托管C++对象和资源。托管C++类正确地使用析构函数和终结器实现IDISPOSIGNEL。因此,我的C#类似乎也应该实现IDisposable。我也想在C#中遵循正确的IDisposable模式

使用托管C+;时正确使用IDisposable模式+;C中的包装器# 我的C类创建并使用了管理(C++)对象,它封装(分配和使用)非托管C++对象和资源。托管C++类正确地使用析构函数和终结器实现IDISPOSIGNEL。因此,我的C#类似乎也应该实现IDisposable。我也想在C#中遵循正确的IDisposable模式,c#,c++-cli,unmanaged,idisposable,C#,C++ Cli,Unmanaged,Idisposable,我不清楚以下几点: 在我的C++类的Debug方法中,我应该把我的托管C++对象当作托管的还是非托管的(因为它们依赖于内部的非托管资源)?李> 是的,您的C#类也应该实现IDisposable。它的Dispose()方法应该只处理C++/CLI对象。不需要终结器,您已经在包装器中实现了一个终结器。您的包装器与包装操作系统资源的许多其他.NET类没有什么不同 例如: class Test : IDisposable { private CppWrapper obj; //...

我不清楚以下几点:

  • 在我的C++类的Debug方法中,我应该把我的托管C++对象当作托管的还是非托管的(因为它们依赖于内部的非托管资源)?李> 是的,您的C#类也应该实现IDisposable。它的Dispose()方法应该只处理C++/CLI对象。不需要终结器,您已经在包装器中实现了一个终结器。您的包装器与包装操作系统资源的许多其他.NET类没有什么不同

    例如:

    class Test : IDisposable {
        private CppWrapper obj;
        //...
        public void Dispose() {
           if (obj != null) { 
               obj.Dispose();
               obj = null;
           }
        }
    }
    

    对不起,请澄清。如果下面是我的C代码,在哪个部分A或B我应该处理我的托管C++类?类测试:IDisposable{private bool isDisposed=false;~Test(){Dispose(false);}受保护的void Dispose(bool disposing){if(disposing){//节A.处置托管资源}//节B.处置未托管资源isDisposed=true;}public void Dispose(){Dispose(true);GC.SuppressFinalize(this);}}}不,不需要此模式,因为您没有终结器。因此,不需要调用GC.SuppressFinalize()和Dispose,disposing设置为false时永远不能调用。为了简单起见,我发布了一个片段。非常感谢汉斯。然而,我引用:“Finalize提供了一个备份,以防止在程序员未能调用Dispose时资源永久泄漏”。如果是这样,为什么不使用终结器呢?因为您的C++/CLI类包装器是拥有非托管资源的包装器。你给了他们一个终结器。这足以确保始终释放非托管资源,即使客户端程序员忘记在C#类上调用Dispose()。再次感谢你,汉斯。干杯