首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >代码分析: CA2000警告

代码分析: CA2000警告
EN

Stack Overflow用户
提问于 2014-07-15 09:14:28
回答 2查看 917关注 0票数 0

下面的代码中有六个CA2000警告。当我做代码分析时,我会收到这个警告。请让我知道如何克服这个警告,以及为什么我会得到这个警告。请务必帮助我如何清除这一警告和感谢提前。

代码语言:javascript
复制
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。

EN

回答 2

Stack Overflow用户

发布于 2014-07-15 09:44:38

之所以会发生这种情况,是因为代码分析无法跟踪TabeHeaderCell将沿着所有路径被释放:

代码语言:javascript
复制
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是一个坏习惯,因为有时候抑制它们可能是非常重要的,而不是--你可能在隐藏内存泄漏。

我纠正这种情况的方法是使用以下模式:

代码语言:javascript
复制
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;
}

这有一个副作用,使您的代码相当冗长,但是您可以重构您的代码,使之有一个方法来创建包含上述代码的表头单元格,并传入变量:

代码语言:javascript
复制
private static void TableHeaderCell CreateTableHeaderCell(int columnSpan, string text)
{
    //Same code as above except don't add it to e.
    return tableHeaderCell;
}

现在,当您减少重复时,代码实际上变得更干净了。

票数 2
EN

Stack Overflow用户

发布于 2014-07-15 09:35:05

显示警告是因为您正在创建TableHeaderCell的实例。TableHeaderCell实现了IDisposable,而不是对其进行处理。在这种情况下,警告可能是,可能是一条鲱鱼,您可以安全地忽略它(右键单击警告->抑制源中的-> ),因为控件在释放这些东西时应该处理掉所有这些东西。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24754255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档