繁体   English   中英

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

[英]What will be the memory allocation of this C#.NET code

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。

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM