如何判断资源是否不受管理?

2023-12-23

我正在使用 Visual Studio 2017 编写 C# 应用程序。我努力通过使用“using”语句来处理我实例化的所有对象。如果我实例化的对象不基于可隐式转换为“System.IDisposable”的类型,Visual Studio 会发出警告。此示例导致 VS 显示警告(C#):

using (uri = new System.Uri(stringVarWithPath))
{
}

是否所有未实现 Dispose 方法的类型都是非托管类型?我问是因为“实现处置方法”(https://learn.microsoft.com/en-us/dotnet/standard/garbage-collection/implementing-dispose https://learn.microsoft.com/en-us/dotnet/standard/garbage-collection/implementing-dispose)似乎暗示它仅适用于非托管资源。


恰恰相反。

首先,您在 .NET 中使用的所有类型都是受管理的。但某些托管类型封装了非托管资源,例如 Windows 句柄。

封装非托管资源的类型,通常实现IDisposable. The IDisposable接口允许您通过调用显式释放这些对象持有的非托管资源Dispose(),或将它们放入using。在后一种情况下,Dispose()退出作用域时自动调用using.

无论如何,即使Dispose()不会在实现它的对象上调用,设计良好的类应该释放它们的非托管资源Finalize()(这基本上是析构函数)。但Finalize()由GC调用,并且我们不知道GC被调用的频率,这使得释放资源的过程是不确定的。没有IDisposable,我们会长时间持有昂贵的非托管资源,远远超过可能需要的时间。

当类型未实现时IDisposable,这表明它不持有非托管资源,并且没有理由显式处置它(当然,前提是该类型设计良好)。

请注意,某些类型实现IDisposable实际上不持有任何非托管资源。例如,测量执行时间的类可以实现IDisposable,以便它在构造函数中保存时间戳,然后在Dispose它获取当前时间戳并计算经过的时间并将其报告给某些日志记录机制。当你把这样一个类放在里面时using,您可以方便地测量代码块的执行时间。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何判断资源是否不受管理? 的相关文章

随机推荐