这是Windows窗体中的示例代码:
namespace WindowsFormsApplication1
{
public class contained
{
public int value;
}
public class container
{
public List<contained> c1 = new List<contained>();
public void add_contained()
{
contained tmp = new contained();
tmp.value = 1; // some default value
c1.Add(tmp);
}
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
container cnt = new container();
cnt.add_contained();
int i = cnt.c1[0].value; // this works, why?
}
}
}
实际上,我有一个大班&#34;容器&#34;管理复杂对象列表&#34;包含&#34;。有一个过程向列表中添加一个新的空白对象 - 稍后要修改。现在,我运行上面的代码并且它有效,但我不明白为什么。
如果程序&#34; add_contained&#34;将一个默认对象添加到列表中会在本地创建一个,我希望它在过程退出时消失,因此列表应保留为空指针。相反,我仍然可以访问列表中的对象,如最后一行所示&#34; int i = ...&#34;。
实际上,我读过垃圾收集器是不确定的,目前还不清楚它是什么意思,似乎它并没有在精确的时刻做事。但是,这意味着上面的代码是有效的,因为它很短?如果我稍后访问该列表(即在更复杂的程序中)它无法工作?解决上述代码所列问题的正确方法是什么?感谢。
答案 0 :(得分:2)
当您执行new contained()
时,会创建一个新对象并将其存储在“某处”
然后将对它的引用分配给tmp
然后将相同的引用添加到列表中并退出方法
此时变量tmp被“销毁”但对象仍在内存中(因为它仍然通过List引用)。
如果在某些时候删除了列表项,那么该对象的引用;并且没有其他关于该目标的参考;它有资格收集,这意味着GC可以释放它的内存。