Удалять или не удалять (CA2000)

Я включаю Анализ кода в старом проекте. Большинство замечаний, которые приводят в результате, я могу понять, но CA2000: Удалить объекты до потери области трудно понять правильно.

Например, этот код со страницы ASP.Net:

private void BuildTable()
{
    HtmlTableRow tr = new HtmlTableRow();
    HtmlTableCell td = new HtmlTableCell();

    tr.Cells.Add(td);
    // add some controls to 'td'

    theTable.Rows.Insert(0, tr);
    // 'theTable' is an HtmlTable control on the page
}

Выдает сообщения CA :

CA2000: Microsoft.Reliability: в методе 'BuildTable ()' вызовите System.IDisposable.Dispose для объекта 'tr' прежде, чем все ссылки на него будут вне области действия.

CA2000: Microsoft.Reliability: в методе 'BuildTable ()' объект 'td' не удаляется по всем путям исключения. Вызовите System.IDisposable.Dispose для объекта 'td' до того, как все ссылки на него выйдут за пределы области видимости. (и подобные сообщения об элементах управления, которые добавлены к этому 'td'.)

Я могу решить вторую проблему:

private void BuildTable()
{
    HtmlTableRow tr = new HtmlTableRow();
    HtmlTableCell td = new HtmlTableCell();

    try
    {
        tr.Cells.Add(td);
        // add some controls to 'td'

        td = null; // this line is only reached when there were no exceptions
    }
    finally
    {
        // only dispose if there were problems ('exception path')
        if (td != null) td.Dispose();
    }

    theTable.Rows.Insert(0, tr);
}

Но я не думаю, что возможно разрешить сообщение о 'tr'. Я не могу избавиться от этого, потому что он все еще нужен после выхода из метода.

Или я что-то пропустил?

Кстати: изменение этого theTable.Rows.Insert в ] theTable.Rows.Add изменяет сообщение CA на «не удаляется по всем исключениям путям»

13
задан Hans Kesting 24 November 2010 в 09:44
поделиться