如果我创建一个类的对象空对象是什么意思?
A obj = new A();
,后来我给你null
它:obj = null;
。
那么它是什么意思obj为null?这是否意味着现在它指向无处,所有的内存都被释放了?
如果我创建一个类的对象空对象是什么意思?
A obj = new A();
,后来我给你null
它:obj = null;
。
那么它是什么意思obj为null?这是否意味着现在它指向无处,所有的内存都被释放了?
这意味着它指向无处,内存有资格在未来某个未定义的时间由垃圾收集器重新分配。
如果/当存储在'obj'中的实例不存在其他引用时。 – 2013-03-24 11:55:51
绝对....并假设没有GC.Collect()或Dispose()或其他... – 2013-03-24 11:57:53
...并保存垃圾收集器*一些*努力,你应该调用'obj.Dispose();'在设置'obj = null;'之前,明确告诉垃圾收集器它可以收集该内存。 – Sebivor 2013-03-24 11:57:59
obj
现在指向参考内存位置null
。
从null (C# Reference)上MSDN:
空关键字是表示一个空引用,一个不指向任何对象文字。
如果您还没有指定它以前指向其他任何对象,该对象将有资格被GC收集。
在内部它意味着这个对象在不被视为根。并且不会被添加到可用对象图中。
因此,它将被视为collect'able。 (非确定性时间)。
您需要明白引用类型(类)实际上是指向内存中数据的指针。实质上,它所做的就是将指针(它只是包含数据地址的一块内存)设置为零值,或者将其设置为空值。
实际上,这意味着如果没有其他数据引用,garbace收集器可能会在任何时候删除它。
技术上,obj
是当你说A obj = new A();
包含A
类型的对象上堆内存的位置的替代名称,但如果你然后说obj = null;
然后obj
现在引用行不通的。
此外,之前由类型A的对象占用的内存(其中obj
是别名)会在GC认为它是正确的时间时由GC返回给操作系统。
这意味着obj
指向无处,并且A
类型的原始引用实例转到gen0。 如果A
是实现IDisposable
的类型,那么当调用Dispose
时,A持有的资源将被释放,并被抑制为最终确定。如果一次性用品没有明确处置,那么它将等待最终确定。
如果之后的执行再次引用它,它来自gen1,然后可能是gen2,它的寿命将会更长。
gc开始收集垃圾的时候,gen0s将成为第一选择,然后是gen1,gen2。
null
不是一个对象。这是一个没有提及任何内容的特殊参考值。如果您尝试使用null
引用与对象进行通信,则会抛出错误,因为没有对象。
还有一种称为Null Object Pattern的设计模式,它被创建用于解决需要特殊情况的参考文献的问题。 A 空对象在这个模式中是一个具有“中立”行为的对象;也就是说,当被要求做某件事实际上什么都不做,并且当被要求返回一个值时返回零,空字符串,空列表和其他安全的中立对象。
请勿混淆空对象与特殊null
参考。
A obj = new A();
参考变量OBJ是甲类型。您正在创建一个A的实例并将其参考分配给obj。 obj现在引用A的实例。
的obj = NULL
上述分配说OBJ现在引用空。那没什么。现在新创建的A实例超出了参考范围,最终将会收集垃圾收集。
我用我的想象力来填写问号。请随时恢复我的更改。 – 2013-03-24 11:56:23