zoukankan      html  css  js  c++  java
  • 编写高质量代码改善C#程序的157个建议——建议53:必要时应将不再使用的对象引用赋值为null

    建议53:必要时应将不再使用的对象引用赋值为null

    在CLR托管的应用程序中,存在一个“根”的概念,类型的静态字段、方法参数、以及局部变量都可以作为“根”的存在(值类型不能作为“根”,只有引用类型的指针才能作为“根”)。

    局部变量在代码运行过程中会在内存中创建一个“根”。在一次垃圾回收中,垃圾回收器会沿着线程栈上行检查“根”(线程栈检查完毕后,还会检查所有的引用类型对象的静态字段的根集合)。当检测到方法内的“根”时,如果发现没有任何一个地方引用了局部变量,则不管是否已经显式将其赋值为null,都意味着该“根”已经被停止。然后,垃圾回收器会发现该根的引用为空,同时标记该根可被释放,这也代表着类型对象所占用的内存空间可以被释放。所以为局部变量指定为null丝毫没有意义,方法的参数变量也是这种情况。

    JIT编译器是一个优化过的编译器,无论我们是否在方法内将局部变量赋值为null,如下面语句:

                SampleClass c1=new SampleClass();
                c1 = null;

    c1 = null;这句都会被忽略。如果我们将项目设置为Release模式,这句话根本不会被编译进运行时内。

    正是由于以上分析,很多人会认为将对象赋值为null完全没有必要。但是,在另一种情况下,却要注意及时地将变量赋值为null,那就是类型的静态字段。将类型对象赋值为null,并不意味着同时将类型的静态字段赋值为null。当类型对象被回收时,类型的静态字段却没有被回收。

    之所以静态字段不被释放(同时赋值为null语句也不会像局部变量那样被运行时编译器优化),是因为静态字段一旦被创建,该“根”就一直存在。所以,垃圾回收器始终不会认为它是一个垃圾。非静态字段则不存在这样一个问题。

    在实际工作中,一旦我们感觉到自己的静态引用类型参数占用的内存空间比较大,并且用完后不会再使用,可以立即将其赋值为null。这也许并不必要,但这是一个好习惯。试想,如果一个系统中那些时不时在类中出现的静态变量,它们那样静静地待在内存中,一旦被创建,就永远不会离开。所以,尽量少用静态变量。

    转自:《编写高质量代码改善C#程序的157个建议》陆敏技

  • 相关阅读:
    WPF Caliburn 学习笔记(五)HelloCaliburn
    MSDN 教程短片 WPF 20(绑定3ObjectDataProvider)
    MSDN 教程短片 WPF 23(3D动画)
    比赛总结一
    HDU3686 Traffic Real Time Query System
    HDU3954 Level up
    EOJ382 Match Maker
    UESTC1565 Smart Typist
    HDU3578 Greedy Tino
    ZOJ1975 The Sierpinski Fractal
  • 原文地址:https://www.cnblogs.com/jesselzj/p/4735267.html
Copyright © 2011-2022 走看看