这个C#.NET代码的内存分配是什么

时间:2010-01-15 13:00:19

标签: c# .net oop memory-management

using System;
class ClassOfInts
{
    public int x;
    public int y;
}    

class Test
{
    ClassOfInts objClassOfInts;
    string name;

    public TestMethod(int p, int q, string s)
    {
        objClassOfInts=new ClassofInts;
        objClassOfInts.x=p;
        objClassOfInts.y=q;
        name=s;
    }
}

class Main
{
    static Main()
    {
        Test t1=new Test();
        Test t2=new Test();
        t1.TestMethod(1,2,"First");
        //XXX
        t2.TestMethod(2,3,"Second");
        //YYY
    }
}

上述程序达到XXX时的内存分配是多少。参考变量objClassInts是否仍会在Heap中对其对象进行处理。或者一旦TestMethod完成执行,objClassInts将被提供为null。

4 个答案:

答案 0 :(得分:2)

Test的每个实例都有自己的objClassOfInts实例。该实例将与Test实例一样长。

在您的示例中,这意味着它们将一直存在到Main结束。

顺便说一句,不使用匈牙利表示法是最佳做法。在“`objClassOfInts'”中我们假设它是某种对象。对象在C#中并不特殊 - 它们是预期的。

答案 1 :(得分:1)

我不确定我是否遵循了这个问题,但除非您将对象设置为null,否则如果您仍然可以访问它,那么该对象仍将存在。垃圾收集的好处是,对象在代码的某些部分不会出乎意料地消失,只有在无法访问它们时才能消除它们。

答案 2 :(得分:1)

当执行达到XXXX时,t1引用的对象有资格进行垃圾回收。其中包括其字段,objClassOfInts和name所持有的对象引用。当它达到YYYY时,t1和t2引用的对象都是合格的。在调试模式下,在方法退出之前,它们将不符合条件。它没有说明实际收集的时间,可能需要一段时间。

答案 3 :(得分:0)

objClassOfInts不会为空。它从null开始,但只要Test对象是实时的,它所引用的所有对象也将是实时的。