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