0

次のコードに3つのCA2000警告があります。cellFirst変数の場合、「using」ブロックを使用することでこれを克服できます。ただし、他の2つのヘッダーセルの場合、コントロールはヘルパー関数で作成されています。

CA2000:Microsoft.Reliability:メソッドGetTableCell(string、int、string、string)で、オブジェクト'lnkHide'がすべての例外パスに沿って配置されるわけではありません。オブジェクトへのすべての参照がスコープ外になる前に、オブジェクト'lnkHide'でSystem.IDisposable.Disposeを呼び出します。

CA2000:Microsoft.Reliability:メソッドGetTableCell(string、int、string、string)で、オブジェクト'ltlText'がすべての例外パスに沿って配置されるわけではありません。オブジェクトへのすべての参照がスコープ外になる前に、オブジェクト'ltlText'でSystem.IDisposable.Disposeを呼び出します。

CA2000:Microsoft.Reliability:メソッドGetTableCell(string、int、string、string)で、オブジェクト'newCell'がすべての例外パスに沿って配置されるわけではありません。オブジェクトへのすべての参照がスコープ外になる前に、オブジェクト'newCell'でSystem.IDisposable.Disposeを呼び出します。

コード

    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. 処分するかしないか(CA2000)

更新されたコード

警告を克服するためにブロックを使用して使用

  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);
        }


    }

質問

警告を克服するために(更新されたコードに示されているように)アプリケーションの「使用」ブロックに落とし穴はありますか?

4

1 に答える 1

0

Web コントロールでの「Using」ブロックの使用の何が問題なのかをお読みください。これについての洞察を得るため。ASP.NET コントロールで dispose を呼び出す必要があるのはなぜですか?も参照してください。

興味深い点は次のとおりです(上記の投稿から):

  1. 私たちがする必要があるのは、Page が破棄されるときに破棄されるように、新しいコントロールが Controls のコレクションに追加されていることを確認することです。
  2. コントロール オブジェクトは、IDisposable インターフェイスを実装します。各親コントロールは、そのすべての子に対して Dispose を呼び出すことができます
  3. IDisposable を実装し、破棄プロセス中に実際にクリーンアップされる状態データを持つ適切に作成されたオブジェクトは、破棄後にパブリック/保護/内部プロパティまたはメソッドのいずれかにアクセスすると、ObjectDisposedException をスローする必要があります。(Dispose が呼び出された後に無効な状態を想定します。) 一部の型は、実際にクリーンアップするものがない場合、この規則を無視し、無効な状態について心配する必要はありません。
于 2012-11-22T09:43:04.290 に答える