3

CA2000 を修正する次のようなコードがあります: スコープを失う前にオブジェクトを破棄します ( http://msdn.microsoft.com/en-us/library/ms182289.aspx )。tbl に null が割り当てられた場合、それが参照したオブジェクトはガベージ コレクションされますか?

    private DataTable BuildRequestDataTable(Factory tableFactory)
    {
        DataTable tbl = null;
        DataTable requestTable = null;
        try
        {
            tbl = tableFactory.CreateTable();
            requestTable = tbl;
            tbl = null;
        }
        finally
        {
            if (tbl != null)
            {
                tbl.Dispose();
            }
        }

        return requestTable;
    }
4

2 に答える 2

8

tbl に null が割り当てられた場合、それが参照したオブジェクトはガベージ コレクションされますか?

いいえ、または少なくとも、すぐにではありません。オブジェクトはそのように参照カウントされません。

なぜこれらすべての変数をジャグリングしているのかは、まったく明確ではありません-どのようにして何かを処分することになるのかわかりません呼び出しCreateTableが成功した場合、次の 2 つのステートメントが成功し、何も破棄されません。または、CreateTable呼び出しがスローされた場合tblでも、null のままで何も破棄されません。

あなたのコードは基本的に次のものと同等です:

private DataTable BuildRequestDataTable(Factory tableFactory)
{
    return tableFactory.CreateTable();
}

その時点で、 を破棄していないという警告が表示される可能性がありますがDataTable、これは意図的なものです。おそらく、呼び出し元が破棄の責任を負うことになります。

もちろん、この時点では、コード自体が実際に多くの利点を提供しているかどうかは明らかではありません。使用するのは簡単ではありません。

using (var table = BuildRequestDataTable(tableFactory))

よりも

using (var table = tableFactory.CreateTable())

... メソッドにさらにロジックを追加する予定がない限り。

于 2012-10-04T20:13:49.953 に答える
1

あなたの目標は、このメソッドで DataTable を返すことです。なぜそれを破棄するのですか? 呼び出し元は、この DataTable を破棄する責任があります。

メソッドは次のようになります。

private DataTable BuildRequestDataTable(Factory tableFactory) 
{ 
   return tableFactory.CreateTable();        
} 
于 2012-10-04T20:13:32.110 に答える