在本地创建的一类对象内的可见性

时间:2015-11-13 01:24:57

标签: c#

这是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;。

实际上,我读过垃圾收集器是不确定的,目前还不清楚它是什么意思,似乎它并没有在精确的时刻做事。但是,这意味着上面的代码是有效的,因为它很短?如果我稍后访问该列表(即在更复杂的程序中)它无法工作?

解决上述代码所列问题的正确方法是什么?感谢。

1 个答案:

答案 0 :(得分:2)

当您执行new contained()时,会创建一个新对象并将其存储在“某处” 然后将对它的引用分配给tmp 然后将相同的引用添加到列表中并退出方法 此时变量tmp被“销毁”但对象仍在内存中(因为它仍然通过List引用)。

如果在某些时候删除了列表项,那么该对象的引用;并且没有其他关于该目标的参考;它有资格收集,这意味着GC可以释放它的内存。