Анализ кода -дружественный способ удаления объектов

В рамках наших стандартов разработки 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?

7
задан SonOfPirate 28 November 2011 в 19:00
поделиться