该不该将变量设为 null ?


对于引用类型的变量,在什么时候需要将其显式设为 null ,在什么时候不需要呢?

局部变量

对于局部变量,在方法结束的时候,变量就会失效,变量指向的对象引用也会减少一个,如果该变量是该对象唯一的引用,那么该对象就会被 GC 回收。这个时候完全没必要显式将变量设为 null,因为这样做只是相当于显式声明了变量作用域的终结。而且,这样做可能会有两个弊端:

  1. 可能会带来 bug 。你在这里将变量显式设为 null ,如果后面有人还要用该变量确却不知道该变量已被设为 null 就会带来 bug
  2. 可能阻止 GC 提前回收该对象。在你最后一次使用该变量后,如果不在后面显式将其设为 null ,那么 CLR 可能会提前检测到该变量后面再无引用,从而提前回收对象资源。如果你在后面显式将其设为 null ,那么 CLR 会认为该变量后面还会被使用,从而不能回收。

成员变量

在两种情形下,可能会将某变量显式设为 null

  1. 它是某个长生存期对象的成员,并且再也不会被该对象使用,而且比较大,在这种时候,将其设为 null 是一种优化。
  2. 它是某个长生存期对象的成员,并且再也不会被该对象使用,并且已经被 dispose 了以释放其占用的资源。这里将其设为 null 是一种安全的做法,因为确定某人误用了一个 null 对象比确定某人误用了一个已被 dispose 的对象更容易些。

该不该将变量设为 null ?的更多相关文章

  1. 关于判断变量是否为null的顺序问题。

    if("y".equals(other)){ } 其中,other字符串变量可能为Null,可以加一个null判断或者将常量写在前面,变量写在equals后面.如果将变量other ...

  2. JAVA变量初始化赋值null

     在Java中,null值表示引用不指向任何对象.运行过程中系统发现使用了这样一个引用时·可以立即停止进一步的访问,不会给系统带来任何危险. 1.如果是对象的field的话那么系统在初始化对象的时候会 ...

  3. C# DateTime变量不能赋null值

    使用定时器的时候: DateTime aimtime=DateTime.Now.AddSeconds(1); CheckTimer() { if(DateTime.Now.CompareTo(aimt ...

  4. 为什么delete指针后指针设为null(已解答)

    int *p;/*........*/delete p; p=null; 看代码的过程中,有这么一个疑问.删除了指针p,指针p既是不存在,怎么还能设置指针p为null呢?为什么还要设置为null呢? ...

  5. php解析json字符串变量总是空白null

    通过接口获取的json字符串使用json_decode始终无法正确解析,返回空白. 直接把结果字符串复制出来手动创建一个变量却正常,在前端js也能解析,搞了半天不得其解,最后发现是接口输出的结果包含有 ...

  6. 过早的给方法中 引用对象 设为 null 可被 GC提前回收吗?

    经常在代码中看到有人将 null 赋值给引用类型,来达到让 GC 提前回收的目的,这样做真的有用吗?今天我们就来研究一下. 为了方便讲解,来一段测试代码,提前将 test1=null ,然后调用 GC ...

  7. null VS undefined

    null VS undefined “null与undefined的区别?” 以前去淘宝面试的时候被问过这个问题,当时只是粗略的按照犀牛书上的答案讲了下,但具体的并没有深入去了解. 后来有机会去问问身 ...

  8. 浅谈js中null和undefined的区别

    在JS中,null和undefined是经常让人摸不着头脑的东西,尤其是在数据初始化以及处理的过程中,经常稍微不注意,就会让页面在渲染时出现报错,下面来细说下,这两者之间的区别: null 表示一个对 ...

  9. JavaScript闭包(Closure)

    JavaScript闭包(Closure) 本文收集了多本书里对JavaScript闭包(Closure)的解释,或许会对理解闭包有一定帮助. <你不知道的JavsScript> Java ...

随机推荐

  1. mysql插入中文数据报错:incorrect string value

    我是用的source指令来执行sql脚本文件时发现的这个错误 我的数据库用创建的时候create Database If Not Exists XXXXXX Character Set UTF8; 那 ...

  2. Friends(老友记)(六人行)相关资源

    迅雷账号:104303980 老友记 Friends 的所有种子: http://www.ttmeiju.com/meiju/Friends.html 老友记(friends)高清(720p)+字幕 ...

  3. marquee 笔记

    页面的自动滚动效果,可由javascript来实现, 但是有一个html标签 - <marquee></marquee>可以实现多种滚动效果,无需js控制. 使用marquee ...

  4. check if a linux process is done using bash 检查进程是否在运行

    # cat > check_process_is_end.sh while truedo   sleep 30 # seconds   res=`ps -ef | grep RNAhybrid` ...

  5. plsql programming 17 过程, 函数与参数

    代码模块化, 即将一大块代码拆成若干小块(过程), 然后就可以在其他模块调用这些模块了, 这样, 重用性更好, 也方便管理. 过程: 过程是一个可以像执行 PL/SQL 语句一样调用的程序, 一个过程 ...

  6. 读写INI辅助类

    using System.Text; using System.Runtime.InteropServices; using System; namespace Benson.INI读写 { #reg ...

  7. 漫游Kafka实现篇之分布式

    Zookeeper节点标记 当路径中的元素包括在方括号里比如[xyz],则表示xyz表示的值是不固定的,每个可能的值都有一个Zookeeper节点.比如/topics/[topic]表示每个topic ...

  8. UIScrollView 期本使用方法

    UIScrollView 1.   contentOffset 默认CGPointZero,用来设置scrollView的滚动偏移量. // 设置scrollView的滚动偏移量 scrollView ...

  9. 在页面中使用js

    JavaScript:用来在页面编写特效的,和HTML\CSS一样当都是由浏览器解析 JavaScript语言 一.JS如何运行(JavaScript,jscript,VbScript,applet ...

  10. js模拟实现继承功能

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...