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

Kyl*_*ney 4 .net c# dispose idisposable return-value

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

我知道总是处理IDisposable实例是一种好习惯.这适用于未使用的返回值吗?Process.Start(processPath);如果你总是写,而不是写作Process.Start(processPath).Dispose();

我认为这显然是肯定的,但我不得不再次猜测自己,因为我只看到它没有完成Dispose().C#可能有一些自动处理这些情况的方法吗?

Dar*_*dan 5

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

using (var file = File.Create())
{
   //use file instance
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这个答案并不能完全反映我的问题.您所说的是将返回值分配给变量然后使用的情况.我说的是返回值未使用的情况.在这种情况下,使用块将为空.对我来说,把它称为语法糖是觉得太尴尬了. (3认同)
  • 但是不要使用`HttpClient`来创建一个应用程序范围的静态实例:D (2认同)

Sas*_*sha 5

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

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

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

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

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