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