C# 中的“非托管”约束与非托管资源和垃圾收集器有关吗?

问题描述 投票:0回答:1

我一直在研究C#中的

unmanaged
约束,它在我脑海中提出了一个问题:
unmanaged
约束是否与“非托管资源”和垃圾收集器的管理有关?

根据 Microsoft 关于 .NET 垃圾收集器的文档,它指出:

  • “对于应用程序创建的大多数对象,您可以依靠 .NET 垃圾收集器来处理内存管理。但是,当您创建包含非托管资源的对象时,您必须在使用完这些资源后显式释放这些资源。 ” 清理非托管资源-.NET |微软学习

有人可以澄清“非托管”约束与垃圾收集器对非托管资源的管理之间是否有直接关系吗?

c# .net garbage-collection computer-science unmanaged
1个回答
0
投票
  1. 非托管资源:在 .NET 垃圾回收上下文中,“非托管”资源是指不由 CLR(公共语言运行时)处理的资源。
  • 非托管对象是在 .NET 库的控制之外创建的,并且不受 CLR 管理,此类非托管代码的示例是 COM 对象、文件流、连接对象、Interop 对象。 (基本上,.NET 代码中引用的第三方库。) 垃圾收集和 C# (codingame.com)

  • .NET 垃圾收集器无法跟踪这些资源,因为它们不是托管环境的一部分,因此需要开发人员显式清理它们,通常通过实现

    IDisposable
    接口并调用
    Dispose
    方法。

  • 如果您的类型使用非托管资源,您应该执行以下操作:

    • 实施处置模式。这要求您提供 IDisposable.Dispose 实现来启用非托管资源的确定性释放。当不再需要该对象(及其使用的资源)时,您类型的使用者会调用 Dispose。 Dispose 方法立即释放非托管资源。 清理非托管资源-.NET |微软学习

  1. 泛型中的“非托管”约束:C# 中的“非托管”约束是泛型代码中使用的类型参数约束。它指定类型参数必须是“非托管”类型,这意味着该类型不是引用类型,并且在任何嵌套级别都不包含任何引用类型字段。它只能包含本身“非托管”的值类型。

  1. 结论: 当开发人员在 .NET 上下文中使用术语“非托管”时,他们通常指的是垃圾收集器无法控制且必须手动清理的资源。 这与泛型类型约束中的“非托管”关键字不同,后者更多的是定义可以与泛型类或方法一起使用的类型类型,特别是对于仅由不受管理的值类型组成的类型CLR。
© www.soinside.com 2019 - 2024. All rights reserved.