Он не предупреждал вас о SqlCommand, который не реализует IDisposable: он предупреждает вас о SqlConnection, который вы обязательно должны удостовериться, что он утилизируется.

ючаю анализ кода в старом проекте. Большинство замечаний, которые я могу понять, но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 на 'не распределяется по всемисключение пути

Ответы на вопрос(5)

Ваш ответ на вопрос