我希望你能为我提供一些帮助和建议。以下是我简化后的类结构(涉及it技术):
public class Bar: IDisposable {...}
public abstract class FooBase: IDisposable
{
Bar bar;
bool disposed;
internal FooBase(Bar bar)
{
this.bar=bar;
}
public void Dispose()
{
Dispose(true);
GC.SupressFinalize(this);
}
protected void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
this.bar.Dispose();
}
this.disposed = true;
}
}
}
public FooA: Foo {...}
public FooB: Foo {...}
public static class FooProvider
{
public static FooA GetFooA()
{
Bar bar = new Bar();
...
return new FooA(bar);
}
public static FooB GetFooB()
{
Bar bar = new Bar();
...
return new FooB(bar);
}
...
}
当我在这个代码上运行代码分析时,FooProvider类中所有'CreateFooX()'方法都会出现警告CA2000。此警告给出以下消息:
Microsoft.可靠性:在方法'FooProvider.GetFooX()'中,在所有对它的引用超出范围之前,调用System.IDisposable.Dispose于对象'bar'。
微软建议永远不要忽略此警告,但我不确定它是否在警告实际存在于代码中的问题。的确,在任何我们考虑的'CreateFooX()'方法中,在去出作用域之前,'bar'没有被处理,但是一个对它的引用存在于'FooX'对象中,该对象最终将被处理并依次负责处理'bar'的处理。
是我没有正确理解处理程序应如何工作,并且代码中存在一些基本缺陷,还是我应该忽略这个警告?
编辑
由于一些评论,我尝试修改工厂方法如下:
public static class FooProvider
{
public static FooA GetFooA()
{
Bar bar = null;
try
{
bar = new Bar();
...
return new FooA(bar);
}
catch
{
if (bar != null) bar.Dispose();
throw;
}
}
...
}
但我仍然收到相同的警告。我猜这只是一个误报,所以我可以忽略它并且安全。谢谢任何建议。
FooBase
只涉及托管资源,并且不直接处理任何非托管资源,则终结器应该是完全不必要的。 - LukeH