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

1 c# garbage-collection dispose using-statement unmanagedresources

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

using (uri = new System.Uri(stringVarWithPath))
{
}
Run Code Online (Sandbox Code Playgroud)

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

fel*_*x-b 6

这是相反的方式.

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

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

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

当一个类型没有实现时IDisposable,它表明它不包含任何非托管资源,并且它没有理由被明确处理(当然,如果类型设计得很好).

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