该不该将变量设为 null ?
对于引用类型的变量,在什么时候需要将其显式设为 null
,在什么时候不需要呢?
局部变量
对于局部变量,在方法结束的时候,变量就会失效,变量指向的对象引用也会减少一个,如果该变量是该对象唯一的引用,那么该对象就会被 GC
回收。这个时候完全没必要显式将变量设为 null
,因为这样做只是相当于显式声明了变量作用域的终结。而且,这样做可能会有两个弊端:
- 可能会带来
bug
。你在这里将变量显式设为null
,如果后面有人还要用该变量确却不知道该变量已被设为null
就会带来bug
。 - 可能阻止
GC
提前回收该对象。在你最后一次使用该变量后,如果不在后面显式将其设为null
,那么CLR
可能会提前检测到该变量后面再无引用,从而提前回收对象资源。如果你在后面显式将其设为null
,那么CLR
会认为该变量后面还会被使用,从而不能回收。
成员变量
在两种情形下,可能会将某变量显式设为 null
。
- 它是某个长生存期对象的成员,并且再也不会被该对象使用,而且比较大,在这种时候,将其设为
null
是一种优化。 - 它是某个长生存期对象的成员,并且再也不会被该对象使用,并且已经被
dispose
了以释放其占用的资源。这里将其设为null
是一种安全的做法,因为确定某人误用了一个null
对象比确定某人误用了一个已被dispose
的对象更容易些。