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)
当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)
...除非您计划在方法中添加更多逻辑.