使用托管 C++ 时正确使用 IDisposable 模式C# 中的包装器

发布于 2024-12-01 01:18:37 字数 249 浏览 0 评论 0原文

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

我不清楚以下内容:

  • 在 C# 类的 Dispose 方法中,我应该将托管 C++ 对象视为托管还是非托管(因为它们内部依赖于非托管资源)?

My C# class creates and uses Managed C++ object that wraps (allocates and uses) unmanaged C++ objects and resources. The Managed C++ class correctly implements IDisposable with Destructor and Finalizer. Therefore, it appears that my C# class should also implement IDisposable. I want to follow correct IDisposable pattern in C# as well.

The following is unclear to me:

  • Within Dispose method of my C# class, should I treat my Managed C++ objects as managed or unmanaged (since they rely on unmanaged resources internally)?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

温柔少女心 2024-12-08 01:18:37

是的,您的 C# 类也应该实现 IDisposable。它的 Dispose() 方法应该简单地处理 C++/CLI 对象。不需要终结器,您已经在包装器中实现了终结器。您的包装器与包装操作系统资源的许多其他 .NET 类没有什么不同。

例如:

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

Yes, your C# class should implement IDisposable as well. Its Dispose() method should simply dispose the C++/CLI objects. No need for a finalizer, you already implemented one in your wrappers. Your wrappers are no different from many other .NET classes that wrap an operating system resource.

For example:

class Test : IDisposable {
    private CppWrapper obj;
    //...
    public void Dispose() {
       if (obj != null) { 
           obj.Dispose();
           obj = null;
       }
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文