Анализ кода: предупреждения CA2000
У меня есть следующий код с шестью предупреждениями CA2000. и я получаю это предупреждение, когда я делаю анализ кода. пожалуйста, дайте мне знать, как преодолеть это предупреждение и почему я получаю это предупреждение. Пожалуйста, помогите мне, как очистить это предупреждение и заранее спасибо.
if (e.Row.RowType == DataControlRowType.Footer)
{
decimal num3 = 0;
foreach (GridViewRow gridViewRow in this.gvTax.Rows)
{
Label label2 = gridViewRow.FindControl("lbltax") as Label;
num3 += Convert.ToDecimal(label2.Text);
}
int count = e.Row.Cells.Count;
for (int i = 0; i <= count - 1; i++)
{
e.Row.Cells[i].Visible = false;
}
TableHeaderCell tableHeaderCell = new TableHeaderCell();
tableHeaderCell.Text = "Total Commission";
tableHeaderCell.ColumnSpan = 1;
tableHeaderCell.HorizontalAlign = HorizontalAlign.Center;
tableHeaderCell.VerticalAlign = VerticalAlign.Middle;
e.Row.Cells.AddAt(0, tableHeaderCell);
tableHeaderCell = new TableHeaderCell();
tableHeaderCell.Text = Math.Round(num, 2).ToString();
tableHeaderCell.ColumnSpan = 1;
tableHeaderCell.HorizontalAlign = HorizontalAlign.Center;
tableHeaderCell.VerticalAlign = VerticalAlign.Middle;
e.Row.Cells.AddAt(1, tableHeaderCell);
tableHeaderCell = new TableHeaderCell();
tableHeaderCell.Text = "Net Commission";
tableHeaderCell.ColumnSpan = 1;
tableHeaderCell.HorizontalAlign = HorizontalAlign.Center;
tableHeaderCell.VerticalAlign = VerticalAlign.Middle;
e.Row.Cells.AddAt(2, tableHeaderCell);
tableHeaderCell = new TableHeaderCell();
tableHeaderCell.Text = Math.Round(num - num3, 2).ToString();
tableHeaderCell.ColumnSpan = 1;
tableHeaderCell.HorizontalAlign = HorizontalAlign.Center;
tableHeaderCell.VerticalAlign = VerticalAlign.Middle;
e.Row.Cells.AddAt(3, tableHeaderCell);
tableHeaderCell = new TableHeaderCell();
tableHeaderCell.Text = "Total Deduction";
tableHeaderCell.ColumnSpan = 1;
tableHeaderCell.HorizontalAlign = HorizontalAlign.Center;
tableHeaderCell.VerticalAlign = VerticalAlign.Middle;
e.Row.Cells.AddAt(4, tableHeaderCell);
tableHeaderCell = new TableHeaderCell();
tableHeaderCell.Text = Math.Round(num3, 2).ToString();
tableHeaderCell.ColumnSpan = 1;
tableHeaderCell.HorizontalAlign = HorizontalAlign.Center;
tableHeaderCell.VerticalAlign = VerticalAlign.Middle;
e.Row.Cells.AddAt(5, tableHeaderCell);
}
}
предупреждения следующие.
01) Предупреждение 1 CA2000: Microsoft.Reliability: в методе "Pay.gvTax_RowDataBound(object, GridViewRowEventArgs)" объект "tableHeaderCell" расположен не по всем путям исключений. Вызовите System.IDisposable.Dispose для объекта tableHeaderCell до того, как все ссылки на него выйдут из области видимости.
02) Предупреждение 2 CA2000: Microsoft.Reliability: в методе "Pay.gvTax_RowDataBound(object, GridViewRowEventArgs)" объект "tableHeaderCell" расположен не по всем путям исключений. Вызовите System.IDisposable.Dispose для объекта tableHeaderCell до того, как все ссылки на него выйдут из области видимости.
03) Предупреждение 4 CA2000: Microsoft.Reliability: в методе "Pay.gvTax_RowDataBound(object, GridViewRowEventArgs)" объект "tableHeaderCell" расположен не по всем путям исключений. Вызовите System.IDisposable.Dispose для объекта tableHeaderCell до того, как все ссылки на него выйдут из области видимости.
04) Предупреждение 4 CA2000: Microsoft.Reliability: в методе "Pay.gvTax_RowDataBound(object, GridViewRowEventArgs)" объект "tableHeaderCell" расположен не по всем путям исключений. Вызовите System.IDisposable.Dispose для объекта tableHeaderCell до того, как все ссылки на него выйдут из области видимости.
05) Предупреждение 5 CA2000: Microsoft.Reliability: в методе "PayCommission.gvCommissionTax_RowDataBound(object, GridViewRowEventArgs)" объект "tableHeaderCell" расположен не по всем путям исключений. Вызовите System.IDisposable.Dispose для объекта tableHeaderCell до того, как все ссылки на него выйдут из области видимости.
06) Предупреждение 6 CA2000: Microsoft.Reliability: в методе "PayCommission.gvCommissionTax_RowDataBound(object, GridViewRowEventArgs)" объект "tableHeaderCell" расположен не по всем путям исключений. Вызовите System.IDisposable.Dispose для объекта tableHeaderCell до того, как все ссылки на него выйдут из области видимости.
2 ответа
Это происходит потому, что Code Analysis не может отследить, что TabeHeaderCell будет удален по всем путям:
TableHeaderCell tableHeaderCell = new TableHeaderCell();
tableHeaderCell.Text = "Total Commission";
tableHeaderCell.ColumnSpan = 1;
tableHeaderCell.HorizontalAlign = HorizontalAlign.Center;
tableHeaderCell.VerticalAlign = VerticalAlign.Middle;
e.Row.Cells.AddAt(0, tableHeaderCell);
Если между строкой 1 и 6 возникает исключение, это приведет к утечке экземпляра. Это крайний случай, и вы можете просто подавить его, но я считаю, что подавление CA2000 - плохая привычка, потому что иногда может быть очень важно не подавлять их - вы можете скрывать утечки памяти.
Я исправляю это, используя следующую схему:
TableHeaderCell tableHeaderCell = new TableHeaderCell();
try
{
tableHeaderCell.Text = "Total Commission";
tableHeaderCell.ColumnSpan = 1;
tableHeaderCell.HorizontalAlign = HorizontalAlign.Center;
tableHeaderCell.VerticalAlign = VerticalAlign.Middle;
e.Row.Cells.AddAt(0, tableHeaderCell);
}
catch
{
tableHeaderCell.Dispose();
throw;
}
Это имеет побочный эффект, делающий ваш код достаточно многословным, однако вы можете реорганизовать ваш код, чтобы иметь метод для создания ячеек заголовка таблицы с приведенным выше кодом внутри и передачи переменных:
private static void TableHeaderCell CreateTableHeaderCell(int columnSpan, string text)
{
//Same code as above except don't add it to e.
return tableHeaderCell;
}
Теперь ваш код на самом деле становится чище, так как вы уменьшаете дублирование.
Предупреждение отображается, потому что вы создаете экземпляр TableHeaderCell. TableHeaderCell реализует IDisposable, а вы его не утилизируете. В этом случае предупреждение, вероятно, представляет собой красную сельдь, и вы можете смело игнорировать его (предупреждение по щелчку правой кнопкой мыши -> подавить -> в источнике), поскольку элемент управления должен утилизировать все эти вещи при его удалении.