首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >代码分析:如何克服CA2000 for TableCell

代码分析:如何克服CA2000 for TableCell
EN

Stack Overflow用户
提问于 2012-11-16 09:18:10
回答 1查看 475关注 0票数 0

下面的代码中有三个CA2000警告。对于cellFirst变量,我可以使用“使用”块来克服这一点。但是对于另外两个头单元,控件是在帮助函数中创建的。

CA2000 : Microsoft.Reliability :在方法GetTableCell(string、int、string、string)中,对象'lnkHide‘不是沿所有异常路径释放的。在所有对对象的引用超出作用域之前,在对象'lnkHide‘上调用lnkHide。 CA2000 : Microsoft.Reliability :在方法GetTableCell(string、int、string、string)中,对象'ltlText‘不是沿所有异常路径释放的。在所有对对象的引用超出作用域之前,在对象'ltlText‘上调用ltlText。 CA2000 : Microsoft.Reliability :在方法GetTableCell(string、int、string、string)中,对象'newCell‘不是沿所有异常路径释放的。在所有对对象的引用超出作用域之前,在对象'newCell‘上调用newCell。

代码语言:javascript
复制
    protected void grdTransactions_RowCreated(object sender, GridViewRowEventArgs e)
    {

        if (e != null)
        {
            if (e.Row.RowType == DataControlRowType.Header)
            {
                GridViewRow newHeaderRow = null;
                try
                {

                    newHeaderRow = new GridViewRow(-1, -1, DataControlRowType.Header, DataControlRowState.Normal);

                    using (TableHeaderCell cellFirst = new TableHeaderCell())
                    {
                        cellFirst.ColumnSpan = 1;
                        cellFirst.Text = "FIRST";
                        newHeaderRow.Cells.Add(cellFirst);
                    }


                    //Associate 
                    #region Associate

                    TableHeaderCell cellAssociate = GetTableCell("tableColGroupAssociate", 4, "associateHide", "Associate Transaction Info");

                    #endregion

                    //Financial 
                    #region Financial

                    TableHeaderCell cellFinancial = GetTableCell("tableColGroupTransaction", 5, "financialHide", "Financial Transaction Info");


                    #endregion

                    newHeaderRow.Cells.Add(cellAssociate);
                    newHeaderRow.Cells.Add(cellFinancial);
                    ((GridView)sender).Controls[0].Controls.AddAt(0, newHeaderRow);

                }
                finally
                {
                    if (newHeaderRow != null)
                    {
                        newHeaderRow.Dispose();
                        newHeaderRow = null;
                    }
                }

            }
        }




    }

    private static TableHeaderCell GetTableCell(string cssClassName, int colSpan, string hideClassName, string displayName)
    {
        TableHeaderCell newCell = new TableHeaderCell();
        newCell.ColumnSpan = colSpan;
        newCell.CssClass = cssClassName;

        LiteralControl ltlText = new LiteralControl();
        ltlText.Text = displayName;
        newCell.Controls.Add(ltlText);

        HyperLink lnkHide = new HyperLink();
        lnkHide.Text = SupportToolUIResource.HideLinkText;
        lnkHide.CssClass = hideClassName;
        lnkHide.Target = SupportToolUIResource.HideLinkTarget;
        newCell.Controls.Add(lnkHide);

        return newCell;
    }

参考

  1. To Dispose or not to Dispose (CA2000)

更新代码

使用块来克服警告

代码语言:javascript
复制
  using (TableHeaderCell cellAssociate = new TableHeaderCell())
                    {
                        GetTableCell(cellAssociate,"tableColGroupAssociate", 4, "associateHide", "Associate Transaction Info");
                        newHeaderRow.Cells.Add(cellAssociate);
                    }


     private static void GetTableCell(TableHeaderCell cellAssociate, string cssClassName, int colSpan, string hideClassName, string displayName)
    {
        cellAssociate.ColumnSpan = colSpan;
        cellAssociate.CssClass = cssClassName;

        using (LiteralControl ltlText = new LiteralControl())
        {
            ltlText.Text = displayName;
            cellAssociate.Controls.Add(ltlText);
        }

        using (HyperLink lnkHide = new HyperLink())
        {
            lnkHide.Text = SupportToolUIResource.HideLinkText;
            lnkHide.CssClass = hideClassName;
            lnkHide.Target = SupportToolUIResource.HideLinkTarget;
            cellAssociate.Controls.Add(lnkHide);
        }


    }

问题

应用程序中是否存在“使用”块(如更新代码所示)来克服警告的缺陷?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-22 09:43:04

请阅读What’s wrong with use of “Using” block on Webcontrols?,以获得有关这方面的一些见解。也请参考Why would I need to call dispose on ASP.NET Controls?

一些兴趣点(来自上述职位)如下:

  1. 我们需要做的是确保添加了新的控件在控件的集合中,以便在释放Page时将其释放。
  2. 控件对象实现IDisposable接口。每个父控件都可以对其所有子控件调用Dispose。
  3. 任何实现IDisposable并在处理过程中实际清理状态数据的正确编写的对象都应该抛出一个ObjectDisposedException,如果它的任何公共/受保护/内部属性或方法在被释放后被访问。(在调用Dispose之后假设无效状态。)如果某些类型实际上没有任何需要清理的东西,并且不必担心无效状态,它们就会忽略这个规则。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13413603

复制
相关文章

相似问题

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