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