关于内存大小,清理对象

时间:2017-12-15 06:25:07

标签: c#

考虑以下示例

class B
{
   int x;
}

class A
{
     int a;
     int b;
     B b1 = new B();

     void testMethod()
     {
        for (int i = 1; i < 10; i++)
            b1 = new B();
     }
}

class MainClass //Will never close this application
{
    static void Main(object[] args)
    {
        A a1 = new A();
        a1.testMethod();
    }
}

在上面的示例中,我每次都在循环中创建一个新的B类对象。所以这里我的问题是当我为b1分配一个新对象时,前一个对象会发生什么,或者它会保留内存。

如果没有清理并增加内存,如何清理?

3 个答案:

答案 0 :(得分:2)

每次创建B

的新对象时
b1 = new B();

存储在b1中的原始对象变得无法访问。这意味着它有资格进行垃圾回收。这样做 意味着它会立即从内存中清除!

符合GC条件的对象实际上是在&#34;将来的某个时间进行GC编辑&#34;。我们不知道,也不需要知道确切的时间。只要相信GC。

换句话说,运行testMethod后,B的9个对象将符合GC条件或已被收集,而第10个对象将保留在变量b1中}。

答案 1 :(得分:1)

每次执行此操作时:b1= new B();,您要为b1分配对新对象的新引用(b1 a {{3因此,之前的引用现在未被使用,因此,垃圾收集器将要处置它。

总结:不增加内存,因为它是ValueType

答案 2 :(得分:0)

任何值类型和引用类型的生命取决于用于定义它的访问说明符和该功能的范围。功能可以是您定义对象的任何类,函数或循环。

在您的情况下,您定义了引用类型B b1 = new B(),没有任何访问说明符(默认访问说明符),因此它将被视为internal。用内部定义的变量不能被外界访问。

b1的范围仅限于您定义代码的for循环。

for (int i = 1; i < 10; i++)
            b1 = new B();

如果您注意到以上两个条件,您将了解在for循环的每次迭代后,{strong>对象b1garbage collector处理。