2016-07-14 70 views
0

比方說,我創建一個對象:創建對象是刪除舊的?

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

namespace CreateObjOnobj 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     testcreate myobjecttotest; 
     myobjecttotest = new testcreate(); 
     myobjecttotest.num = 20; 
     myobjecttotest.bill = true; 
     myobjecttotest = new testcreate(); 
     Console.WriteLine(myobjecttotest.bill.ToString()); 
     Console.ReadKey(); 
    } 
} 
class testcreate 
     { 
     public int num = 0; 
     public bool bill = false; 
     } 

} 

這段代碼自動刪除的對象,並創建一個沒有記憶喪失一個新的?

謝謝

+0

是。這就是Java和C#等垃圾收集語言所做的:)您創建了第二個「myobjecttotest」,第一個可用於垃圾收集。 – paulsm4

回答

5

不完全是。

實際上會發生什麼事是你改變變量指向的第一個對象,而現在它指向的第二個對象。從那時起,沒有人再指向第一個對象。

由於.NET裝有自動存儲器管理,垃圾回收器會定期檢查對象沒有「根」 - 那些沒有人持有與參考。它從內存中刪除這些「孤立」對象。

但是 - 你可以沒有關於何時將出現垃圾收集的假設。它會在稍後發生,這就是你所知道的。

通常,在創建第二對象,並改變它的變量以指向所述第二對象,則最終在存儲器中的兩個對象。有時稍後,第一個對象將被垃圾收集器刪除。

2

基本上是的,但更詳細沒有。

當您重新分配一個變量參考previos對象丟失。然而,只要垃圾收集器不踢它,實例本身仍然存在。無論如何,只要沒有處理非託管引用,你就不會太在乎這些。 COM對象,你必須以某種方式釋放。因此,同樣的情況,當你創建一個類的實例和「離開」該變量的範圍爲:

void MyMethod() 
{ 
    var myVar new MyClass(); 
} 

當你離開的方法的變量,併爲此給您的MyClass實例的所有引用被刪除,因此被標記爲垃圾收集。但是你不知道什麼時候會發生。

1

是的,它會自動收集垃圾,除非有另一個實例指向該對象。

例如:

我們創造的testcreate另一個實例,將與第一個實例的指針賦值。

testcreate myobjecttotest = new testcreate(); 
testcreate myobjecttotest2 = myobjecttotest; 

因此,如果我們重新實例myobjecttotest = new testcreate()

以前的對象不會因爲myobjecttotest2刪除當前指向它

+0

非常感謝的人! – Jablonovo