问一句,设置为null的话,上边的代码不会出错么?

解决方案 »

  1.   

    设置为null只是解除了一个引用,不代表控件被销毁。控件使用了非托管资源,有析构方法,如果不主动Dispose,等到所有引用都解除,GC会把它放到析构队列,最后执行析构之后才是真正销毁。这个过程可能很久。如果确定要销毁,应该主动调用Dispose,而不是设置成null。你看到的代码里,如果是这个控件在别处还有使用,只是这里不再需要,那么解绑是应该的。如果把这个引用当作一个标志,自己的逻辑需要判断它,那么设置null是合理的。如果这个代码是属于销毁的逻辑,那么设置null不必要。关于事件绑定,如果把短生命周期的对象挂接在长生命周期的对象的事件上,不解绑的话会导致这些短生命周期的对象无法释放,直到绑定的长生命周期对象释放,它们才能释放。所以一般规则是,短生命周期的对象销毁的逻辑里需要把挂接在长生命周期的对象的事件解绑。否则会造成内存泄漏。而关于设置null这个话题,这里有详细的分析。
      

  2.   


    引用自身方法是不需要特地去释放的,如form.Designer里面的事件绑定,你也没见到有解绑的操作。
    需要手动解绑除了上面说的引用了其它类中的方法,还有是用自身方法去注册了一个全局的事件。如果注册了Application.ApplicationExit事件。另:在Dispose的时候写tabPageManager = null;其实是没必要的,详见《编写高质量代码:改善C#程序的151个建议》第4章。
    Release编译时IL是直接忽略这段代码的。
      

  3.   

    多谢楼上各位的回答,关于null的使用真是涨姿势了。
    英文文章好难啃啊,能介绍一篇中文的博文吗