在C#中,如果你已经完成使用一个对象变量,即使它将要超出范围,是否有必要将其赋值为 null
?
在C#中,如果你已经完成使用一个对象变量,即使它将要超出范围,是否有必要将其赋值为 null
?
不要将其设置为null,否则可能会存在危险和缺陷(考虑到有人可能尝试稍后使用它,但并不意识到它已被设置为null)。只有在有逻辑理由需要将其设置为null时才这样做。
在我看来,更重要的是要对实现了IDisposable
接口的对象调用Dispose
方法。
除此之外,将null
赋值给引用变量只意味着您明确表示作用域结束——大多数情况下,这只是一些指令提前执行(例如方法体中的局部变量)——随着编译器/JIT优化的时代,运行时很可能会执行相同的操作,因此您真正得不到任何好处。在一些情况下,例如应用程序级别的静态变量等,如果您已经完成使用某个对象,则应将其赋值为null
,以便让垃圾回收机制回收该对象。
null
赋值的影响。当您将 null
分配给变量时,实际上正在潜在地更改变量引用的对象的生命周期。即使“说您不再需要该对象”也是一种过度简化。(您实际上是在说您不需要它在这里。您可能需要它在其他地方!) - Stephen C在将汽车推向湖边之前,您是否应该关闭它的引擎?
不需要。这是一个常见的误解,但并不会有任何影响。您只是将一个引用设置为null,而不是将 对象 设置为null - 对象仍然存在于内存中,必须由垃圾收集器继续回收。
这些回复中大多数都给出了正确的答案,但是理由错了。
如果它是一个局部变量,那么在方法结束时该变量将从堆栈中弹出,因此它指向的对象将有一个较少的引用。如果该变量是对象的唯一引用,则该对象可供GC使用。
如果您将变量设置为null(许多人在学习时被教导在方法末尾这样做),则实际上可能会延长对象停留在内存中的时间,因为CLR将认为对象无法收集,直到在下面看到代码引用该对象。但是,如果省略null的设置,则CLR可以确定在代码的某个点之后不再出现对象的更多调用,即使方法尚未完成,GC也可以收集对象。
将变量赋值为null通常是一个不好的想法:
唯一我会将某些东西赋值为null以“清除”不再使用的变量,而不是因为null实际上是我想要分配的值的时候,有两种可能情况:
这些情况都不适用于局部变量,只适用于成员,而且都很少见。
不会。对于本地变量来说,你是否有对象的引用并不影响任何事情,重要的是这个引用是否会被使用。
在代码中加入额外的空赋值并不会对性能造成太大影响,也不会影响内存管理,但它会增加无意义的语句,使代码难以阅读。
垃圾收集器知道引用在代码中最后一次使用的时间,因此它可以在对象不再需要时立即回收它。
示例:
{
// Create an object
StringBuilder b = new StringBuilder();
b.Append("asdf");
// Here is the last use of the object:
string x = b.ToString();
// From this point the object can be collected whenever the GC feels like it
// If you assign a null reference to the variable here is irrelevant
b = null;
}
我只想补充一点,据我所知,这仅适用于 Visual Basic 的一个版本,甚至连那个版本也有争议。(如果我没记错的话,它仅适用于 DAO 对象。)