【发布时间】:2013-04-08 02:54:31
【问题描述】:
这行代码将堆上的内存空间分配给对象 foo
var foo =new object();
这行代码会释放它吗?
foo=null;
或者它只是清除对堆上内存位置的引用。
【问题讨论】:
-
你的意思是
foo = null;吗?
标签: c#
这行代码将堆上的内存空间分配给对象 foo
var foo =new object();
这行代码会释放它吗?
foo=null;
或者它只是清除对堆上内存位置的引用。
【问题讨论】:
foo = null; 吗?
标签: c#
它只是删除了引用。当运行时认为合适时,对象本身会被垃圾收集,并且实际上与引用是否被擦除无关。
【讨论】:
在 C# 中,所有对象都会被垃圾回收,您不能“删除”它们。
当对给定对象的最后一个引用超出范围时,该对象可能会 收藏。您当然可以将尽可能多的引用归零,但是 只要 any 引用仍然持有该对象,该对象将保持活动状态 对象。
所以设置 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;
【讨论】: