这行代码在堆上为对象foo
分配一个内存空间var foo =new object();
这行代码会释放它吗?
foo=null;
或者只是消除对堆上内存位置的引用。
答案 0 :(得分:3)
它只是删除了引用。当运行时认为适合时,对象本身是垃圾收集的,并且实际上与是否擦除引用无关。
答案 1 :(得分:2)
在C#中,所有对象都是垃圾回收的,你不能“删除”它们。
当对给定对象的最后一次引用超出范围时,该对象容易受到攻击 采集。你可以找到尽可能多的引用,但是 只要任何引用仍然保持该对象,该对象将保持活动状态 对象
因此设置foo=null;
只会删除引用。
垃圾收集包括以下步骤:
- 垃圾收集器搜索所管理的对象 在托管代码中引用。
- 垃圾收集器尝试最终确定不是的对象 引用。
- 垃圾收集器释放未引用的对象 回忆起他们的记忆。
醇>
了解垃圾收集器的工作方式非常重要GC Class
// Set a break-point here to see that foo = null.
// However, the compiler considers it "unassigned."
// and generates a compiler error if you try to
// use the variable.
object foo;
// Now foo has a value.
foo = new object();
// Set foo to null again. The object it referenced
// is no longer accessible and can now be garbage-collected.
foo = null;