gpt4 book ai didi

.net - 在 Disposable 模式中什么算作 "Unmanaged Resource"?

转载 作者:行者123 更新时间:2023-12-04 14:32:36 27 4
gpt4 key购买 nike

我正在使用此处描述的模式来管理处置:
http://www.developerzen.com/2006/01/09/finalizableobject-developing-a-base-class-for-idisposable-objects/

什么算作“非托管资源”?

以下是我心中的一些令人困惑的点:

  • 在某些时候,.NET 只是包装 Win32 调用,对吗?那么大多数.NET 对象在某种程度上不是非托管资源吗?
  • 那些我们有 .NET 包装器的 COM 对象呢?它们被认为是什么?
  • 仅从 P/Invokes 获得功能的托管类呢?
  • 内部使用 native 库的 C++/CLI 类呢?在 C# 级别,具有析构函数的 C++/CLI 类现在实现了 IDisposable ......它们被认为是什么?

  • 我意识到博客文章有点旧。如果有更现代的方法来管理非托管和托管对象的生命周期,请提出建议。

    编辑:谁投票结束这个,请提供一些关于我如何改进这个问题的细节。

    最佳答案

    我理解困惑。我认为有一些简单的指导方针可以遵循:

  • 如果您的类“拥有”对另一个对象的引用(即您的对象创建了另一个对象,或者在理解您的对象现在“拥有”它的情况下获得了对该对象的引用),那么您有责任进行任何必要的清理(如果有)
  • 如果那个其他对象是一个 .NET 对象并且没有实现 IDisposable 接口(interface),那么您可能不需要做任何事情。按照惯例,IDisposable 接口(interface)是我们用来声明对象是否需要清理的接口(interface)。
  • 如果该其他对象是 .NET 对象并实现了 IDisposable 接口(interface),那么您的类也应该实现 IDisposable 接口(interface)。在您的 Dispose 方法中,只需调用另一个对象的 Dispose 方法。
  • 如果该其他对象是非托管对象或资源,则您的类应实现终结器以确保清理非托管对象/资源。请遵循该博客文章中描述的指南,了解如何实现。

  • 以下是您的问题的一些具体答案。

    • At some point, .NET is just wrapping Win32 calls, right? So aren't most of the .NET objects in a way an Unmanaged Resource?


    尽管 .NET 对象可以包装 Win32 调用,但术语“非托管资源”并不合适,因为它是一个 .NET 对象,因此根据定义它是“托管资源”。 CLR 处理这些对象的内存分配和垃圾回收。

    • What about COM objects that we have .NET wrappers for -- what are they considered?


    .NET 包装器对象仍然是 .NET 对象,因此它们是“托管资源”,但请注意它们必须实现自己的处置/完成逻辑。基本上,他们负责清理“非托管资源”,这样您就不必这样做了。如果您正在为 COM 对象实现自己的包装器,那么您将负责实现必要的处置/完成逻辑来清理它,这样包装器的使用者就不必这样做。

    • What about managed classes that get functionality solely from P/Invokes?


    使用 P/Invoke 调用非托管代码的托管类可能正在分配非托管资源,具体取决于它所调用的内容。因此,它可能有必要实现必要的处置/完成逻辑来清理那些非托管资源。

    • What about C++/CLI classes that internally use native libraries?


    是的,它们也可能从 native 库分配非托管资源,因此它们也有必要实现必要的析构函数/终结器逻辑。

    • At the C# level, the C++/CLI classes that had destructors now implement IDisposable... what are they considered?


    在 C++/CLI 中,您可以选择将类声明为托管(使用 ref 关键字)或非托管(不使用 ref 关键字)。如果它是用 ref 关键字声明的,那么它是一个托管类;它将在托管堆上分配,一旦超出范围并且不再有对它的引用,就会被垃圾收集器清理。如果声明类时没有使用 ref 关键字,则它是非托管的,必须显式清除。在任何一种情况下,该类都可能分配了需要在析构函数/终结器中清理的非托管资源。

    关于.net - 在 Disposable 模式中什么算作 "Unmanaged Resource"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9949399/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com