C# 对象超出范围

C# 对象超出范围,c#,reference,garbage-collection,C#,Reference,Garbage Collection,我们有下面这样的代码来修复CA2000:在失去作用域之前处理对象()。当tbl被赋值为null时,它引用的对象是否会被垃圾回收 private DataTable BuildRequestDataTable(Factory tableFactory) { DataTable tbl = null; DataTable requestTable = null; try { tbl = table

我们有下面这样的代码来修复CA2000:在失去作用域之前处理对象()。当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;
    }

您的目标是在这个方法中返回DataTable,那么为什么要处理它呢? 调用者现在负责处理这个数据表

您的方法应该是:

private DataTable BuildRequestDataTable(Factory tableFactory) 
{ 
   return tableFactory.CreateTable();        
} 
当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;
    }
不,至少不是马上。对象的引用计数不是这样的

现在还不清楚你为什么要处理所有这些变量——我看不出你最终会如何处理任何东西。
CreateTable
调用成功,在这种情况下,以下两条语句将成功且不会处理任何内容;或者
CreateTable
调用抛出,在这种情况下,
tbl
仍将为null且不会处理任何内容

您的代码基本上等同于:

private DataTable BuildRequestDataTable(Factory tableFactory)
{
    return tableFactory.CreateTable();
}
此时,您可能会收到一条警告,说明您没有处理
数据表
,但这是故意的-调用者可能会承担处理它的责任

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

using (var table = BuildRequestDataTable(tableFactory))


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

整个方法可能只是
返回tableFactory.CreateTable()
@hatchet-如果try块成功完成,它将不会被释放,因为
tbl
将为空。我看不到任何实际执行Dispose的情况。这只能发生在
requestTable=tbl
tbl=null
中抛出的异常上,这两种情况似乎都不太可能发生。我同意-整个方法似乎没有必要。你说的对象引用计数不是这样是什么意思?@aziz:我的意思是,当你将值
null
分配给
tbl
时,这不会导致内部计数递减。垃圾收集器只要在运行时找到所有可访问的对象,并清理其余的对象。