null对象是什么意思?

如果我创建一个类的对象

A obj = new A(); 

后来我给它指定了nullobj = null;

那么obj是null是什么意思呢? 这是否意味着它现在指向无处并且所有内存都被解除分配?

obj现在指向null引用内存位置。

从MSDN上的null(C#Reference) :

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

如果您尚未将之前指向的对象分配给其他任何对象,则该对象将有资格由GC收集。

这意味着它无处指向并且内存符合垃圾收集器在未来某个未定义时间的释放。

null不是对象。 它是一个特殊的参考值,不引用任何内容。 如果尝试使用null引用与对象通信,则会引发错误,因为没有对象。

还有一种称为空对象模式的设计模式 ,用于解决需要特殊情况的null引用问题。 此模式中的null对象是具有“中性”行为的对象; 也就是说,当被要求做某事时实际上什么都不做,当被要求返回一个值时,返回零,空字符串,空列表和其他安全,中立的对象。

不要将null对象与特殊的null引用混淆。

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

因此,它将被视为可收集的。 (非确定性时间。)。

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

在实践中,这意味着如果没有其他对数据的引用,则garbace收集器可以在任何时候将其移除。

从技术上讲,当你说A obj = new A();时, obj是堆上内存位置的替代名称,它包含类型A的对象A obj = new A();

但是如果你再说obj = null; 然后obj现在引用无处。

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

一个obj = new A();

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

obj = null

上面的赋值说obj现在引用null 。 那没什么。 现在,新创建的A实例已经不在引用状态,最终会被垃圾回收

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

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

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