В рамках наших стандартов разработки Visual Studio 2010 (преимущественно C # 4.0) у нас включен анализ кода. Когда я просматриваю недавно представленный код для нового проекта, я вижу тонну
CA2000: Microsoft.Reliability: в методе 'XYZ' объект 'ABC' не удаляется по всем путям исключений. Вызовите System.IDisposable.Dispose для объекта 'ABC' до того, как все ссылки на него будут вне области видимости.
предупреждения.Проблема в том, что я ничего не делаю, чтобы избавиться от предупреждений - и я часами рылся в сети и пробовал все, что мог.
Во-первых, позвольте мне прояснить, что я не говорю о помещении простого блока using для правильного удаления локальной переменной - это не проблема. В моем случае эти предупреждения появляются, когда объект либо возвращается методом, либо назначается другому объекту внутри метода.
Вот пример кода, который содержит четыре таких предупреждения:
public void MainMethod()
{
var object1 = CreateFirstObject(); // Warning here
var object2 = CreateSecondObject(); // Warning here
SomeCollectionProperty.Add(object1);
SomeCollectionProperty.Add(object2);
}
private SomeObject CreateFirstObject()
{
var theObject = new SomeObject() // Warning here
{
FirstProperty = "some value",
// ...
};
return theObject;
}
private SomeOtherObject CreateSecondObject()
{
var theObject = new SomeOtherObject() // Warning here
{
FirstProperty = "a different value",
// ...
};
return theObject;
}
Я прокомментировал строки, в которых появляются предупреждения.
Я попытался провести рефакторинг обоих методов Create, как описано в статье MSDN ( здесь ), но предупреждения все равно появляются.
ОБНОВЛЕНИЕ Я должен отметить, что и SomeObject, и SomeOtherObject реализуют IDisposable.
Кроме того, хотя инициализаторы объектов могут быть компонентом проблемы, имейте в виду, что инициализаторы изолированы от двух частных методов и не имеют ничего общего с предупреждениями в MainMethod.
Может ли кто-нибудь показать мне, как правильно реализовать эти методы для устранения предупреждений CA2000?