Мне нужен совет, надеюсь, кто-нибудь мне поможет. У меня есть следующая структура класса (упрощенно):
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);
}
...
}
Когда я запускаю Code Analysis для этого, я получаю Warnings CA2000 для всех методов CreateFooX () класса FooProvider. Это предупреждение выдает следующее сообщение:
«Microsoft. Надежность: в методе« FooProvider.GetFooX () »вызовите System.IDisposable.Dispose для объекта« bar »до того, как все ссылки на него выйдут из области видимости."
Microsoft рекомендует никогда не подавлять это предупреждение, но я не совсем уверен, что оно предупреждает о реальной проблеме в коде. Правда, «bar» не удаляется до выхода из области видимости в любом методе «CreateFooX ()», который мы рассматриваем, но ссылка на него находится в объекте «FooX», который в конечном итоге будет удален и, в свою очередь, позаботится об утилизации бар.
Я правильно понимаю, что шаблон Dispose должен работать, и у меня есть какой-то фундаментальный недостаток в коде, или я должен просто отключить это предупреждение?
EDIT
Из-за некоторых комментариев я попытался изменить фабричные методы следующим образом:
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;
}
}
...
}
Но я все еще получаю то же предупреждение. Я предполагаю, что это просто ложный позитив, и я в безопасности, приняв его.
Спасибо за любой совет.