这行代码将堆上的内存空间分配给对象 foo
var foo =new object();
这行代码会释放它吗?
foo=null;
或者它只是消除对堆上内存位置的引用。
它只是删除了引用。当运行时认为合适时,对象本身会被垃圾收集,并且实际上与引用是否被擦除无关。
在 C# 中,所有对象都会被垃圾回收,您不能“删除”它们。
当对给定对象的最后一个引用超出范围时,该对象可能会被收集。您当然可以尽可能多地为空引用,但只要任何引用仍然持有该对象,该对象就会保持活动状态。
所以设置foo=null;
它只是删除参考。
垃圾收集包括以下步骤:
- 垃圾收集器搜索托管代码中引用的托管对象。
- 垃圾收集器尝试终结未引用的对象。
- 垃圾收集器释放未被引用的对象并回收它们的内存。
了解垃圾收集器的工作原理很重要GC 类
// 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;