代码之家  ›  专栏  ›  技术社区  ›  user2414250

如何判断资源是否处于非托管状态?

  •  2
  • user2414250  · 技术社区  · 7 年前

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

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

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

    1 回复  |  直到 7 年前
        1
  •  7
  •   felix-b    7 年前

    反之亦然。

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

    封装非托管资源的类型通常实现 IDisposable . 这个 IDisposable可识别 接口允许您通过调用 Dispose() ,或将其放入 using . 在后一种情况下, Dispose() 退出的作用域时自动调用 使用 .

    无论如何,即使 Dispose() 未在实现它的对象上调用,设计良好的类应在中释放其非托管资源 Finalize() (基本上是析构函数)。但是 完成() 由GC调用,我们不知道调用GC的频率,这意味着释放资源的过程不确定。没有 IDisposable可识别 ,我们将长期持有昂贵的非托管资源,这远远超出了我们的需要。

    当类型未实现时 IDisposable可识别 ,这表示它不包含非托管资源,并且没有理由显式地处理它(当然,前提是类型设计良好)。

    请注意,一些实现 IDisposable可识别 不要实际持有任何非托管资源。例如,测量执行时间的类可以实现 IDisposable可识别 ,以便在构造函数中保存时间戳,然后在 Dispose 它获取当前时间戳并计算经过的时间,并将其报告给某些日志记录机制。当你把这样一门课放进去的时候 使用 ,您可以获得一种方便的方法来测量代码块的执行时间。

    推荐文章