2016-07-14 3 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; 
     } 

} 

ли этот код автоматически удалить объект и создать новый без потери памяти ??

Thanks

+0

Да. Это то, что сборщик мусора собирает такие языки, как Java и C#. Один из них вы создали свой второй «myobjecttotest», первый из которых доступен для сбора мусора. – paulsm4

ответ

5

Не совсем.

На самом деле происходит изменение переменной, указывающей на первый объект, и теперь она указывает на второй объект. С этого момента никто больше не указывает на первый объект.

Поскольку .NET оснащен автоматическим управлением памятью, сборщик мусора периодически проверяет объекты без «корней» - те, на которые никто не ссылается. Он удаляет из памяти такие «сиротские» объекты.

НО - вы не можете делать никаких предположений о том, когда произойдет сбор мусора. Это произойдет иногда позже, это все, что вы знаете.

В общем случае, когда вы создаете второй объект и изменяете переменную, чтобы указать на второй объект, в итоге вы получаете два объекта в памяти. Иногда позже первый объект будет удален сборщиком мусора.

2

В принципе да, но более подробно нет.

Когда вы повторно назначаете переменную, ссылка на объект previas теряется. Однако сам экземпляр все еще существует до тех пор, пока сборщик мусора не пинает его. Во всяком случае, вам не о чем беспокоиться до тех пор, пока не будут обработаны неуправляемые ссылки. COM-объекты, которые вы должны каким-то образом выпустить. Так что же происходит, когда вы создаете экземпляр класса и «оставить» сферу этой переменной:

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

При выходе из метода переменной и для этого все ссылки на ваш экземпляр MyClass удаляются и, таким образом, обозначены для сбора мусора. Однако вы не знаете, когда это произойдет.

1

Да, это будет автоматически собирать мусор, если нет другого экземпляра, указывающего на этот объект.

Например:

Мы создали еще один экземпляр testcreate, который будет назначен со значением указателя первого экземпляра.

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

Так что, если мы reinstantiate myobjecttotest = new testcreate()

Предыдущий объект не будет удален, так как myobjecttotest2 в настоящее время указывает на него

+0

Большое спасибо людям! – Jablonovo