创建一个对象是删除旧对象吗?

时间:2016-07-14 08:04:39

标签: c# object constructor instance destructor

假设我创建了一个对象:

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

}

此代码是否自动删除对象并创建一个新对象而不会丢失内存?

谢谢

3 个答案:

答案 0 :(得分:5)

不完全是。

实际发生的是您更改指向第一个对象的变量,现在它指向第二个对象。从那一刻开始,没有人再指向第一个物体了。

由于.NET配备了自动内存管理功能,垃圾收集器会定期检查没有" root" - 那些没人提到的。它删除了这样的"孤儿"记忆中的物体。

但是 - 您不能对垃圾收集何时发生做出任何假设。有时候会发生这种情况,这就是你所知道的。

通常,当您创建第二个对象并将变量更改为指向第二个对象时,最终会在内存中生成两个对象。有时候,垃圾收集器会删除第一个对象。

答案 1 :(得分:2)

基本上是,但更详细地说没有。

重新分配变量时,对previos对象的引用会丢失。但是,只要垃圾收集器没有踢它,实例本身仍然存在。无论如何,只要没有处理非托管引用,你就不会关心它 - 例如您必须以某种方式释放的COM对象。因此,当您创建类的实例并“保留”该变量的范围时,也会发生同样的情况:

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

当您离开方法时,变量及其对MyClass实例的所有引用都将被删除,因此被标记为垃圾收集。但是你不知道什么时候会发生这种情况。

答案 2 :(得分:1)

是的,它将自动被垃圾收集,除非有另一个实例指向该对象。

例如:

我们创建了另一个testcreate实例,它将被赋予第一个实例的指针值。

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

因此,如果我们重新myobjecttotest = new testcreate()

由于myobjecttotest2当前指向它

,因此不会删除上一个对象