对象超出范围

时间:2012-10-04 20:08:59

标签: c# reference garbage-collection

我们有以下代码来修复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;
    }

2 个答案:

答案 0 :(得分:8)

  

当tbl被赋值为null时,它引用垃圾的对象会被收集吗?

没有。或者至少,不是立即。对象不像那样被引用计数。

为什么你根本不知道所有这些变量还不是很清楚 - 我无法看到你曾经最终处置任何事情。 CreateTable调用成功,在这种情况下,以下两个语句将成功,不会处理任何内容,或CreateTable调用抛出,在这种情况下,tbl仍然为空,没有任何内容处置。

您的代码基本上等同于:

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

此时您可能会收到警告,表示您没有处置DataTable,但这是故意的 - 调用者可能会负责处理它。

当然,目前尚不清楚代码本身是否真正提供了很多好处 - 它并不容易使用:

using (var table = BuildRequestDataTable(tableFactory))

大于

using (var table = tableFactory.CreateTable())

...除非您计划在方法中添加更多逻辑。

答案 1 :(得分:1)

你的目标是在这个方法中返回DataTable,为什么要处理它呢? Caller现在负责处理此DataTable。

您的方法应该只是:

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