1

这行代码将堆上的内存空间分配给对象 foo

var foo =new object();

这行代码会释放它吗?

foo=null;

或者它只是消除对堆上内存位置的引用。

4

2 回答 2

3

它只是删除了引用。当运行时认为合适时,对象本身会被垃圾收集,并且实际上与引用是否被擦除无关。

于 2013-04-08T02:56:26.737 回答
2

在 C# 中,所有对象都会被垃圾回收,您不能“删除”它们。

当对给定对象的最后一个引用超出范围时,该对象可能会被收集。您当然可以尽可能多地为空引用,但只要任何引用仍然持有该对象,该对象就会保持活动状态。

所以设置foo=null;它只是删除参考。

垃圾收集包括以下步骤:

  1. 垃圾收集器搜索托管代码中引用的托管对象。
  2. 垃圾收集器尝试终结未引用的对象。
  3. 垃圾收集器释放未被引用的对象并回收它们的内存。

了解垃圾收集器的工作原理很重要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;
于 2013-04-08T02:58:21.773 回答