某些静态方法(例如Process.Start()
和File.Create()
)构造并返回经常被丢弃的IDisposable
个实例。使用这些方法是正常的,就好像它们返回void
一样,如果你不注意,你可能会错过它们甚至根本没有返回值的事实。
我知道始终处置IDisposable
实例是一种好习惯。这适用于未使用的返回值吗?如果你总是写Process.Start(processPath);
?
Process.Start(processPath).Dispose();
我认为这显然是肯定的,但我必须先猜测自己,因为我只看到它没有Dispose()
。 C#可能有一些自动处理这些情况的方法吗?
答案 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主题中描述并包含:
一般情况下,我强烈建议始终明确调用Dispose 方法以避免离奇问题。
但是你应该只处理你拥有的那些对象(你创建并知道它们何时不再使用)。我遇到了一些情况,当我使用一些IDisposable资源,获得另一个IDisposable作为它的属性,显然我不应该在我停止使用引用对象之前处置对象的属性 - 它将在处理时自己执行它。 / p>