【问题标题】:What will be the memory allocation of this C#.NET code这个 C#.NET 代码的内存分配是多少
【发布时间】:2011-01-05 12:10:51
【问题描述】:
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 是否仍会引用其在堆中的对象。或 TestMethod 完成执行后,objClassInts 将引用为 null。

【问题讨论】:

  • 我认为当你到达 XXX 时objClassInts 不会为空是很安全的,因为你仍然有对t1 的引用,而objClassInts 是类@987654325 的类范围变量@ 刚刚通过调用 TestMethod 设置。

标签: c# .net oop memory-management


【解决方案1】:

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

在您的示例中,这意味着他们都将活到 Main 结束。

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

【讨论】:

  • 我完全同意约翰关于匈牙利符号的看法。
  • 感谢您提及匈牙利符号。
【解决方案2】:

我不确定我是否遵循了这个问题,但是除非您将对象设置为 null,否则如果您仍然可以访问它,那么该对象仍然会存在。垃圾回收的好处是对象不会在代码的某些部分中令人惊讶地消失,它们只会在您无论如何都无法访问它们时被删除

【讨论】:

    【解决方案3】:

    objClassOfInts 不会为空。它以 null 开头,但只要 Test 对象处于活动状态,它所引用的所有对象也将处于活动状态。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2011-03-03
        • 2017-03-22
        • 2015-05-31
        • 2010-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-24
        • 1970-01-01
        相关资源
        最近更新 更多