2016-07-14 14 views
0

Lassen Sie uns sagen, dass ich ein Objekt erstellen: ein neues ohne Verlust im SpeicherErstellen eines Objekts löscht das alte?

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; 
     } 

} 

löscht dieser Code das Objekt automatisch und schaffen ??

Danke

+0

Ja. Das ist, was Garbage Collection-Sprachen wie Java und C# gemacht haben :) Du hast deinen zweiten "myobjecttotest" erstellt, der erste ist für die Garbage Collection verfügbar. – paulsm4

Antwort

5

Nicht genau.

Was tatsächlich passiert, ist, dass Sie die Variable ändern, die auf das erste Objekt zeigte, und jetzt zeigt es auf das zweite Objekt. Von diesem Moment an zeigt niemand mehr auf das erste Objekt.

Da .NET mit automatischer Speicherverwaltung ausgestattet ist, sucht der Garbage Collector regelmäßig nach Objekten ohne "Wurzeln" - auf die niemand einen Verweis hat. Es entfernt solche "verwaisten" Objekte aus dem Speicher.

ABER - Sie können keine Annahmen darüber treffen, wann die Garbage Collection stattfinden wird. Es wird manchmal später auftreten, das ist alles was du weißt.

Wenn Sie ein zweites Objekt erstellen und die Variable so ändern, dass sie auf das zweite Objekt zeigt, werden im Allgemeinen zwei Objekte im Speicher angezeigt. Manchmal später wird das erste Objekt vom Garbage Collector entfernt.

2

Grundsätzlich ja aber ausführlicher nein.

Wenn Sie eine Variable neu zuweisen, geht der Verweis auf das vorherige Objekt verloren. Die Instanz selbst existiert jedoch so lange, wie Garbage Collector sie nicht ausführt. Wie auch immer, es interessiert Sie nicht, solange keine unmanaged Referenzen behandelt werden - z. COM-Objekte, die Sie irgendwie freigeben müssen. So passiert das gleiche wie wenn Sie eine Instanz einer Klasse erstellen und „verlassen“, um den Umfang dieser Variablen:

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

Wenn Sie das Verfahren die Variable verlassen und dafür alle Verweise auf die Instanz von MyClass erhalten gelöscht und damit sind für die Müllsammlung markiert. Sie wissen jedoch nicht, wann das passieren wird.

1

Ja, es wird automatisch eine Garbage Collection durchgeführt, es sei denn, eine andere Instanz verweist auf dieses Objekt.

Zum Beispiel:

Wir haben eine andere Instanz testcreate, die mit dem Zeigerwert der ersten Instanz zugewiesen.

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

Wenn wir also myobjecttotest = new testcreate()

Das vorherige Objekt Reinstanziierung nicht da myobjecttotest2 gelöscht werden derzeit zeigt es

+0

Vielen Dank Leute! – Jablonovo

Verwandte Themen