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调用成功,在这种情况下,以下两个语句将成功并且不会处理任何内容,或者CreateTable调用 throws,在这种情况下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 回答