C#防止內存泄露的方法


一般程序員()都會這樣認為:用C#這樣的語言編程的一個好處就是無需再考慮內存的分配和釋放。你只需創建對象,然后通過一種叫做垃圾收集的機制來處理這 些對象,也就是說:當它們不再被應用程序需要的時候來自動的清除這些對象。這個過程意味着C#解決了其它語言中極難處理的問題──可怕的內存泄露。真的是 這樣嗎?
     其實不然,讓我們先了解一下垃圾收集的工作原理。垃圾收集器的工作就是尋找那些不再被應用程序需要的對象,當它們不會再被訪問或引用的時候清除它們。(一定要注意是在不會再被訪問或引用的時候才清除它們)


   一個對象只有當它不再被引用的時候才會被當作是無用的 ,所以我們在聲明對象和定義變量的時候最好是在定義的時候 給一個NUll,

如果 到本行代碼以后不會再使用這個對象了, 請把它設置為Null

例如

 

        //二級代理表
        private DataTable _dt_two = new DataTable();

        //用戶表
        private DataTable _dt_officeInfo = new DataTable();

 

這樣做很明顯是不合理的,因為你也不知道在使用的過程 中到低會不會加載數據,當然這樣確定 不會再出現未對對象引用到對象實例這樣的錯誤 了,

當然也說明了一個問題,這樣做是不合理的,正確的應該是這樣

而當使用的時候 再給其真正的值。

復制代碼
 //二級代理表
        
代碼

 

復制代碼

 

當不再使用的時候 應該給其一個Null

復制代碼
//二級代理       
private DataTable _dt_two = null;

        //用戶表
        private DataTable _dt_officeInfo = null;


         //數據
             _dt_two =getDataTable();
            _dt_officeInfo =getDataTable();

            _dt_two =null;
            _dt_officeInfo =null
復制代碼

 

     當明白了它的回收機制之后我想我們應該知道 怎么樣去做了,當然有的程序 員會說沒有時候這樣寫,呵呵 ,其實我感覺 代碼的規范還有合理不合理,和時間真的沒有太大關系 是個人的習慣而已,當你寫的習慣了也就不感覺 不舒服了,而且 會喜歡上規范的代碼 ,因為程序以后的路大多都 是在抄前面寫的代碼,如果 你之前都 寫的很棒了,那為以后的發展幫助會是巨大的。

 

發文后說明

      老趙說的是,我做過試驗,還有 Anders Liu    所說的”代“
一種是:
    GC.Collect() 這種方法對所有的代進行回收
另一種是:
    GC.Collect(int) 這種方法對0、1、2代,指明的代進行回收。

我測試了一下,內存有時候確實有變化但不是太明示,不過也有,我記錄下來的內存變化,發現

 ,在有的時候 設置Dispos()方法或Close()方法時,如果不使用using或try{} finally{}進行釋放,如果沒有進行有效釋放的話,會導制對象進行二次回收 .這樣一下反而是得不嘗失了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM