处理未使用的 IDisposable return 值是否重要?

Is it important to dispose unused IDisposable return values?

有某些静态方法如Process.Start()File.Create()构造和returnIDisposable实例经常被丢弃。使用这些方法非常正常,就好像它们 return void 一样,如果您不注意,您可能会错过它们甚至有 return 个值的事实。

我知道始终处理 IDisposable 个实例是一种很好的做法。这是否适用于未使用的 return 值?而不是写 Process.Start(processPath); 你应该总是写 Process.Start(processPath).Dispose();?

我认为这显然是肯定的,但我不得不重新猜测自己,因为我只见过没有 Dispose() 的情况。 C# 是否有一些自动处理这些情况的方法?

在大多数情况下,处理 IDisposable 实例的首选方法是使用 using 语句:

using (var file = File.Create())
{
   //use file instance
}

这个语法糖将确保文件实例在您退出 using 语句块后被显式处理。在幕后,它实际上将您的代码包装到 try/finally 块中。

.NET 具有 Finalizer 的概念,许多实现 IDisposable 的 BCL 类型也实现了 Finalizer。您可以查看 MSDN Dispose Pattern article and this CodeProject post 了解更多详情。因此,如果您不手动处理某些对象,它可能会在稍后处理。问题是以后(和其他潜在问题)是否适合您,或者您需要在某个特定点明确和确定地处理它。

this 线程中描述了跳过 Dispose 方法调用和依赖 Finalizer 的缺点,包括:

  1. 性能问题
  2. 使用时间超过预期的锁定资源问题
  3. 即使您有异常处理策略也会有崩溃风险

一般来说,我强烈建议始终显式调用 Dispose 方法以避免古怪的问题。

但是您应该仅处置您拥有的那些对象(您创建并知道何时不再使用它们)。当我使用一些 IDisposable 资源时,我遇到过这样的情况,得到另一个 IDisposable 作为它的 属性 显然我不应该在停止使用引用对象之前处理一个对象的 属性 - 它会做处理后会自行处理。