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