如果我创建一个类的对象
A obj = new A();
以后我将null
分配给它:obj = null;
。
那么obj为null是什么意思?这是否意味着它现在指向无处并且所有内存都被解除分配?
答案 0 :(得分:7)
obj
现在指向null
引用内存位置。
来自MSDN上的null (C# Reference):
null关键字是表示空引用的文字,不引用任何对象。
如果您尚未将之前指向的对象分配给其他任何对象,则该对象将有资格由GC收集。
答案 1 :(得分:4)
这意味着它无处指向,并且内存有资格在将来某个未定义的时间由垃圾收集器重新分配。
答案 2 :(得分:3)
null
不是对象。它是一个特殊的参考值,不引用任何内容。如果您尝试使用null
引用与对象通信,则会抛出错误,因为没有对象。
还有一种名为Null Object Pattern的设计模式,用于解决需要特殊情况的null
引用问题。此模式中的 null对象是具有“中性”行为的对象;也就是说,当被要求做某事时实际上什么都不做,当被要求返回一个值时,返回零,空字符串,空列表和其他安全,中立的对象。
不要将 null对象与特殊null
引用混淆。
答案 3 :(得分:2)
在内部,它意味着此对象不被视为根。并且不会被添加到可用对象图中。
因此,它将被视为可收集的。 (非确定性时间。)。
答案 4 :(得分:2)
您需要了解引用类型(类)实际上是指向内存中数据的指针。本质上,它所做的是将指针(它只是包含数据地址的一块内存)设置为零值,或者为null。
实际上,这意味着如果没有其他对数据的引用,那么garbace收集器可以随时将其删除。
答案 5 :(得分:2)
从技术上讲,obj
是堆上内存位置的替代名称,当您说A
时,它包含A obj = new A();
类型的对象
但是,如果你说obj = null;
,那么obj
现在无法引用。
以前由类型A的对象占用的内存,obj
是别名,当GC认为是正确的时间时,GC会将其返回给操作系统。
答案 6 :(得分:2)
这意味着obj
指向无处,类型A
的原始引用实例转到gen0。
如果A
是实现IDisposable
的类型,则在Dispose
调用时将释放A保留的资源,并将其抑制为最终确定。如果没有明确处理一次性用品,那么它将等待最终确定。
如果之后的执行再次引用它,它来自gen1然后可能是gen2,它的生命周期将会更长。
当gc收集垃圾时,gen0s将成为收集的第一选择,然后是gen1,gen2。
答案 7 :(得分:2)
obj = new A();
引用变量 obj 的类型为 A 。您正在创建 A 的实例,并将其引用分配给 obj 。 obj 现在引用了 A 的实例。
obj = null
上述作业说 obj 现在引用 null 。那没什么。现在,新创建的 A 实例已经不在引用状态,最终将垃圾收集。