1

如果我创建一个类的对象

A obj = new A();

后来我分配null给它:obj = null;.

那么obj为null是什么意思呢?这是否意味着现在它没有指向任何地方并且所有内存都被释放了?

4

8 回答 8

8

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

从MSDN 上的null(C# 参考) :

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

如果您没有将它以前指向的对象分配给其他任何对象,则该对象将有资格被 GC 收集。

于 2013-03-24T11:55:33.127 回答
4

这意味着它没有指向任何地方,并且内存有资格在未来某个未定义的时间被垃圾收集器释放。

于 2013-03-24T11:54:05.923 回答
3

null不是一个对象。这是一个特殊的参考值,什么都不引用。如果您尝试使用null引用与对象通信,则会引发错误,因为没有对象。

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

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

于 2013-03-24T12:19:22.403 回答
2

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

因此,它将被视为可收藏的。(不确定的时间。)。

于 2013-03-24T11:55:36.093 回答
2

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

实际上,这意味着如果没有其他对数据的引用,垃圾收集器可以随时将其删除。

于 2013-03-24T11:56:56.947 回答
2

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

但是,如果您当时说obj = null;then objnow 无处引用。

还有之前被类型 A 的对象占用的内存,它obj是一个别名,当 GC 认为是正确的时间时,它将由 GC 归还给操作系统。

于 2013-03-24T11:58:44.050 回答
2

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

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

当 gc 来收集垃圾的时候,gen0s 将是被收集的首选,然后是 gen1,gen2。

于 2013-03-24T12:11:22.450 回答
2

一个 obj = 新的 A();

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

对象 = 空

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

于 2013-03-24T12:29:30.007 回答