对象超出范围

azi*_*ziz 3 c# garbage-collection reference

我们有类似下面的代码来修复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;
    }
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 8

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

不,或者至少,不是立即.对象不像那样引用计数.

这真不明白你为什么杂耍所有这些变量在所有-我不能看你怎么会永远结束的任何处置.无论是CreateTable调用成功,在这种情况下,以下两个语句会成功,什么都不会,或者布置有CreateTable调用抛出,在这种情况下,tbl仍然将是无效的,没有什么会被布置.

您的代码基本上等同于:

private DataTable BuildRequestDataTable(Factory tableFactory)
{
    return tableFactory.CreateTable();
}
Run Code Online (Sandbox Code Playgroud)

那时你很可能会得到一个警告,你没有处理DataTable,但这是故意的 - 调用者可能会负责处理它.

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

using (var table = BuildRequestDataTable(tableFactory))
Run Code Online (Sandbox Code Playgroud)

using (var table = tableFactory.CreateTable())
Run Code Online (Sandbox Code Playgroud)

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