处理未使用的 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 的缺点,包括:
- 性能问题
- 使用时间超过预期的锁定资源问题
- 即使您有异常处理策略也会有崩溃风险
一般来说,我强烈建议始终显式调用 Dispose 方法以避免古怪的问题。
但是您应该仅处置您拥有的那些对象(您创建并知道何时不再使用它们)。当我使用一些 IDisposable 资源时,我遇到过这样的情况,得到另一个 IDisposable 作为它的 属性 显然我不应该在停止使用引用对象之前处理一个对象的 属性 - 它会做处理后会自行处理。
有某些静态方法如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 的缺点,包括:
- 性能问题
- 使用时间超过预期的锁定资源问题
- 即使您有异常处理策略也会有崩溃风险
一般来说,我强烈建议始终显式调用 Dispose 方法以避免古怪的问题。
但是您应该仅处置您拥有的那些对象(您创建并知道何时不再使用它们)。当我使用一些 IDisposable 资源时,我遇到过这样的情况,得到另一个 IDisposable 作为它的 属性 显然我不应该在停止使用引用对象之前处理一个对象的 属性 - 它会做处理后会自行处理。