【问题标题】:creating an object is deleting the old one?创建一个对象是删除旧的?
【发布时间】:2016-11-17 01:07:19
【问题描述】:

假设我创建了一个对象:

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

}

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

谢谢

【问题讨论】:

  • 是的。这就是垃圾收集语言(如 Java 和 C#)所做的 :) 您创建了第二个“myobjecttotest”,第一个可用于垃圾收集。

标签: c# object constructor instance destructor


【解决方案1】:

不完全是。

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

由于 .NET 配备了自动内存管理,垃圾收集器会定期检查没有“根”的对象——那些没有人持有引用的对象。它会从内存中删除这些“孤儿”对象。

但是——您不能对垃圾收集何时发生做出任何假设。它有时会在以后发生,这就是你所知道的。

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      例如:

      我们创建了另一个testcreate 实例,将为其分配第一个实例的指针值。

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

      所以如果我们重新实例化myobjecttotest = new testcreate()

      之前的对象不会被删除,因为myobjecttotest2当前正在指向它

      【讨论】:

        猜你喜欢
        • 2017-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-08
        • 1970-01-01
        • 2013-07-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多