0

次のコードに CA2000 警告が 6 つあります。コード分​​析を行うと、この警告が表示されます。この警告を克服する方法と、この警告が表示される理由を教えてください。この警告をクリアする方法を教えてください。事前に感謝します。

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' で System.IDisposable.Dispose を呼び出します。

02) 警告 2 CA2000: Microsoft.Reliability: メソッド 'Pay.gvTax_RowDataBound(object, GridViewRowEventArgs)' で、オブジェクト 'tableHeaderCell' がすべての例外パスに沿って配置されていません。オブジェクトへのすべての参照が範囲外になる前に、オブジェクト 'tableHeaderCell' で System.IDisposable.Dispose を呼び出します。

03) 警告 4 CA2000 : Microsoft.Reliability : メソッド 'Pay.gvTax_RowDataBound(object, GridViewRowEventArgs)' で、オブジェクト 'tableHeaderCell' がすべての例外パスに沿って配置されていません。オブジェクトへのすべての参照が範囲外になる前に、オブジェクト 'tableHeaderCell' で System.IDisposable.Dispose を呼び出します。

04) 警告 4 CA2000 : Microsoft.Reliability : メソッド 'Pay.gvTax_RowDataBound(object, GridViewRowEventArgs)' で、オブジェクト 'tableHeaderCell' がすべての例外パスに沿って配置されていません。オブジェクトへのすべての参照が範囲外になる前に、オブジェクト 'tableHeaderCell' で System.IDisposable.Dispose を呼び出します。

05) 警告 5 CA2000 : Microsoft.Reliability : メソッド 'PayCommission.gvCommissionTax_RowDataBound(object, GridViewRowEventArgs)' で、オブジェクト 'tableHeaderCell' がすべての例外パスに沿って配置されていません。オブジェクトへのすべての参照が範囲外になる前に、オブジェクト 'tableHeaderCell' で System.IDisposable.Dispose を呼び出します。

06) 警告 6 CA2000 : Microsoft.Reliability : メソッド 'PayCommission.gvCommissionTax_RowDataBound(object, GridViewRowEventArgs)' で、オブジェクト 'tableHeaderCell' がすべての例外パスに沿って配置されていません。オブジェクトへのすべての参照が範囲外になる前に、オブジェクト 'tableHeaderCell' で System.IDisposable.Dispose を呼び出します。

4

2 に答える 2

2

これは、コード分析が、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 を抑制しないことが非常に重要な場合があるため、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-15T09:44:38.010 に答える
0

TableHeaderCell のインスタンスを作成しているため、警告が表示されます。TableHeaderCell は IDisposable を実装しており、破棄していません。この場合、警告はおそらくニシンであり、コントロールは破棄されるときにこれらすべてのものを破棄する必要があるため、安全に無視できます (警告を右クリック -> 抑制 -> ソース内)。

于 2014-07-15T09:35:05.560 に答える