【发布时间】:2020-01-28 08:05:26
【问题描述】:
所以我有一个实现 IDisposable 的类,并且我有几个方法(在另一个类中)遵循以下模式:
public void SomeMethod()
{
DisposableObject disposableObject = new DisposableObject();
// Do some stuff with the object
SomeOtherMethod(disposableObject);
disposableObject.Dispose();
}
虽然所有这些方法都做不同的事情,但它们最后都会调用SomeOtherMethod,这会在不再需要一次性对象之前对它做更多的事情。
当我将disposableObject.Dispose(); 移动到SomeOtherMethod 时,Visual Studio 会给我一条消息说:
"使用推荐的 dispose 模式来确保 'new DisposableObject()' 创建的对象在所有路径上都被释放:using statement/declaration 或 try/finally"
无论我是否使用 ref 关键字将一次性对象传递给 SomeOtherMethod,都会显示此消息。
我的问题是,只要SomeOtherMethod 调用Dispose() 就可以处理该对象吗?我假设它会,并且 Visual Studio 继续发送消息只是因为它没有“知道”在后续方法中该对象发生了什么,但我很想得到一些确认!
【问题讨论】:
-
无论哪个 scope 分配对象都拥有它,并且应该是处置它的对象。简单的。在上面放一个
using块。使用“转移语义”,即赋予SomeOtherMethod所有权并让其处置对象,可能会导致混淆,最好避免。 -
即IDE0067,代码分析警告。它试图告诉您,如果该方法抛出异常,则该对象可能不会被释放。尽管代码分析通常难以生成关于 IDisposable 使用情况的良好诊断,但这可能是正确的。您确实喜欢这里的 using 语句。只有在 Dispose() 调用后该方法需要很长时间才能执行时,在被调用方法中处理它才是明智之举。
标签: c# idisposable