如何为类中的值类型变量分配内存

时间:2012-01-23 10:19:44

标签: c# .net

我在下面有一个类作为一个带有值类型变量的方法。

请有人解释一下,当我创建下面的对象然后堆栈上发生了什么以及堆上发生了什么?

我对Method1中变量的位置感兴趣。

class A
{
    public void Method1()
    {
       int i = 10;
    }
}

A obj = new A();
obj.Method1();

2 个答案:

答案 0 :(得分:5)

你很可能不需要知道这一点。对你来说,重要的是运行时的,而不是 它是如何做到的。运行时可以自由选择任何方式来实现局部变量。如你所知,它们可以保存在一个文件中(虽然这样做没有多大意义)。

如果你真的想知道,一般来说,有几种方法可以在内存中表示局部变量:

  1. 根本没有任何陈述。如果运行时决定可以优化变量,则可以这样做。如果没有从变量中读取任何内容,就会发生这种情况,例如在您的代码中。
  2. 它可以在寄存器中。如果变量足够小以适合寄存器,并且运行时决定注册它是有效的。
  3. 它可以在堆栈上。
  4. 它可以是堆上类的一部分。这种情况恰好在使用lambda,迭代器块和C#5的async方法的方法中关闭变量。

答案 1 :(得分:1)

对象本身在堆上(因为它是引用类型),对类(obj)的引用进入堆栈,局部变量int i是值类型并且去在堆栈上或被优化掉或进入寄存器。

但是你不应该关心.NET运行时的这些实现细节,因为它们理论上可以改变......并且对实现细节进行不必要的依赖编码是不好的做法恕我直言。