2015-03-19 99 views
0

請告訴我爲什麼〜Destruct()等待刪除代碼中的對象直到結束?我認爲破壞必須創建一個對象並立即刪除它。但是,我的代碼創建了10000個對象,只有在完成後纔會刪除10000個。爲什麼?對象的系統破壞

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace project6 
{ 
    class Destruct 
    { 
     public int x; 
     public Destruct(int i) 
     { 
      x = i; 
     } 
     ~Destruct() 
     { 
      Console.WriteLine("\n"+ x +" - Обьект разрушен"); 
     } 
     public void generator(int i) 
     { 
      Destruct obj = new Destruct(i); 
     } 
    } 


    class Program 
    { 
     static void Main() 
     { 
      Destruct o = new Destruct(0); 
      for(int a=0;a<10000;a++) 
      { 
       o.generator(a);  
      } 
      Console.WriteLine("Готово"); 
      } 
    } 
} 

回答

2

C#使用垃圾回收來刪除對象。它不一定會在每個對象超出範圍的時刻運行 - 這些對象僅僅是「排隊」進行刪除。這就是爲什麼所有的對象都被創建,然後全部被刪除。

基本上,你不知道垃圾收集器何時運行。

0

〜Destruct的原因叫做AFTER你的循環是〜Destruct()函數只有在垃圾回收器運行時纔會被調用。如果您強制垃圾收集器運行,那麼當超出範圍時,您的對象將被立即銷燬。

 for(int a=0;a<10000;a++) 
     { 
      o.generator(a); 

      //This will IMMEDIATLY destroy the object created by o.generator 
      GC.Collect() 
     } 

你可能從來沒有真正想這樣做的真正的代碼,讓GC(垃圾收集器)運行時,它需要,因爲它的將是什麼時候清理內存聰明得多。