处置未使用的IDisposable返回值是否重要?

时间:2018-04-23 14:03:24

标签: c# .net return-value dispose idisposable

某些静态方法(例如Process.Start()File.Create())构造并返回经常被丢弃的IDisposable个实例。使用这些方法是正常的,就好像它们返回void一样,如果你不注意,你可能会错过它们甚至根本没有返回值的事实。

我知道始终处置IDisposable实例是一种好习惯。这适用于未使用的返回值吗?如果你总是写Process.Start(processPath);

,而不是写Process.Start(processPath).Dispose();

我认为这显然是肯定的,但我必须先猜测自己,因为我只看到它没有Dispose()。 C#可能有一些自动处理这些情况的方法吗?

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:5)

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

跳过Dispose 方法调用和依赖Finalizer的缺点在this主题中描述并包含:

  1. 效果问题
  2. 使用时间超过预期的锁定资源的问题
  3. 即使您有异常处理政策,也有崩溃风险
  4. 一般情况下,我强烈建议始终明确调用Dispose 方法以避免离奇问题。

    但是你应该只处理你拥有的那些对象(你创建并知道它们何时不再使用)。我遇到了一些情况,当我使用一些IDisposable资源,获得另一个IDisposable作为它的属性,显然我不应该在我停止使用引用对象之前处置对象的属性 - 它将在处理时自己执行它。 / p>