2013-03-24 79 views
0

如果我创建一个类的对象空对象是什么意思?

A obj = new A(); 

,后来我给你null它:obj = null;

那么它是什么意思obj为null?这是否意味着现在它指向无处,所有的内存都被释放了?

+4

我用我的想象力来填写问号。请随时恢复我的更改。 – 2013-03-24 11:56:23

回答

4

这意味着它指向无处,内存有资格在未来某个未定义的时间由垃圾收集器重新分配。

+8

如果/当存储在'obj'中的实例不存在其他引用时。 – 2013-03-24 11:55:51

+0

绝对....并假设没有GC.Collect()或Dispose()或其他... – 2013-03-24 11:57:53

+0

...并保存垃圾收集器*一些*努力,你应该调用'obj.Dispose();'在设置'obj = null;'之前,明确告诉垃圾收集器它可以收集该内存。 – Sebivor 2013-03-24 11:57:59

7

obj现在指向参考内存位置null

null (C# Reference)上MSDN:

空关键字是表示一个空引用,一个不指向任何对象文字。

如果您还没有指定它以前指向其他任何对象,该对象将有资格被GC收集。

2

在内部它意味着这个对象在不被视为根。并且不会被添加到可用对象图中。

因此,它将被视为collect'able。 (非确定性时间)。

2

您需要明白引用类型(类)实际上是指向内存中数据的指针。实质上,它所做的就是将指针(它只是包含数据地址的一块内存)设置为零值,或者将其设置为空值。

实际上,这意味着如果没有其他数据引用,garbace收集器可能会在任何时候删除它。

2

技术上,obj是当你说A obj = new A();

包含A类型的对象上堆内存的位置的替代名称,但如果你然后说obj = null;然后obj现在引用行不通的。

此外,之前由类型A的对象占用的内存(其中obj是别名)会在GC认为它是正确的时间时由GC返回给操作系统。

2

这意味着obj指向无处,并且A类型的原始引用实例转到gen0。 如果A是实现IDisposable的类型,那么当调用Dispose时,A持有的资源将被释放,并被抑制为最终确定。如果一次性用品没有明确处置,那么它将等待最终确定。

如果之后的执行再次引用它,它来自gen1,然后可能是gen2,它的寿命将会更长。

gc开始收集垃圾的时候,gen0s将成为第一选择,然后是gen1,gen2。

3

null不是一个对象。这是一个没有提及任何内容的特殊参考值。如果您尝试使用null引用与对象进行通信,则会抛出错误,因为没有对象。

还有一种称为Null Object Pattern的设计模式,它被创建用于解决需要特殊情况的参考文献的问题。 A 空对象在这个模式中是一个具有“中立”行为的对象;也就是说,当被要求做某件事实际上什么都不做,并且当被要求返回一个值时返回零,空字符串,空列表和其他安全的中立对象。

请勿混淆空对象与特殊null参考。

2

A obj = new A();

参考变量OBJ类型。您正在创建一个A的实例并将其参考分配给objobj现在引用A的实例。

的obj = NULL

上述分配说OBJ现在引用。那没什么。现在新创建的A实例超出了参考范围,最终将会收集垃圾收集