下面的代码中有六个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’不是沿所有异常路径释放的。在所有对对象的引用超出作用域之前,在对象'tableHeaderCell‘上调用tableHeaderCell。
02)警告2 CA2000 : Microsoft.Reliability :在方法'Pay.gvTax_RowDataBound( object,GridViewRowEventArgs)‘中,对象'tableHeaderCell’并非沿所有异常路径被释放。在所有对对象的引用超出作用域之前,在对象'tableHeaderCell‘上调用tableHeaderCell。
3)警告4 CA2000 : Microsoft.Reliability :在方法'Pay.gvTax_RowDataBound( object,GridViewRowEventArgs)‘中,对象'tableHeaderCell’并非沿所有异常路径被释放。在所有对对象的引用超出作用域之前,在对象'tableHeaderCell‘上调用tableHeaderCell。
4)警告4 CA2000 : Microsoft.Reliability :在方法'Pay.gvTax_RowDataBound( object,GridViewRowEventArgs)‘中,对象'tableHeaderCell’并非沿所有异常路径被释放。在所有对对象的引用超出作用域之前,在对象'tableHeaderCell‘上调用tableHeaderCell。
5)警告5 CA2000 : Microsoft.Reliability :在方法Microsoft.Reliability GridViewRowEventArgs)‘中,对象'tableHeaderCell’不是沿所有异常路径释放的。在所有对对象的引用超出作用域之前,在对象'tableHeaderCell‘上调用tableHeaderCell。
06)警告6 CA2000 : Microsoft.Reliability :在方法Microsoft.Reliability GridViewRowEventArgs)‘中,对象'tableHeaderCell’不是沿所有异常路径释放的。在所有对对象的引用超出作用域之前,在对象'tableHeaderCell‘上调用tableHeaderCell。
发布于 2014-07-15 09:44:38
之所以会发生这种情况,是因为代码分析无法跟踪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;
}现在,当您减少重复时,代码实际上变得更干净了。
发布于 2014-07-15 09:35:05
显示警告是因为您正在创建TableHeaderCell的实例。TableHeaderCell实现了IDisposable,而不是对其进行处理。在这种情况下,警告可能是,可能是一条鲱鱼,您可以安全地忽略它(右键单击警告->抑制源中的-> ),因为控件在释放这些东西时应该处理掉所有这些东西。
https://stackoverflow.com/questions/24754255
复制相似问题