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

C# 如何为类中的值类型变量分配内存,c#,.net,C#,.net,我在下面有一个类,它是一个带有值类型变量的方法 请有人给我解释一下,当我创建下面的对象时,堆栈上会有什么,堆上会有什么 我对Method1中的变量的位置感兴趣 class A { public void Method1() { int i = 10; } } A obj = new A(); obj.Method1(); 对象本身放在堆上(因为它是引用类型),对类的引用(obj)放在堆栈上,局部变量int i是一个值类型,放在堆栈上,或者进行优化,或者放

我在下面有一个类,它是一个带有值类型变量的方法

请有人给我解释一下,当我创建下面的对象时,堆栈上会有什么,堆上会有什么

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

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

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

对象本身放在堆上(因为它是引用类型),对类的引用(
obj
)放在堆栈上,局部变量
int i
是一个值类型,放在堆栈上,或者进行优化,或者放在寄存器中


但是您不应该关心.NET运行时的这些实现细节,因为它们在理论上可能会改变。。。对实现细节进行不必要的依赖性编码是不好的做法。

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

如果您确实想知道,通常有几种方法可以在内存中表示局部变量:

  • 根本没有代表。如果运行时决定可以对变量进行优化,它可以这样做。如果没有从变量中读取任何内容(如在代码中),则可能会发生这种情况
  • 它可以在寄存器中。如果变量足够小,可以放入寄存器,并且运行时决定重新注册它是有效的
  • 它可以在堆栈上
  • 它可以是堆上类的一部分。这发生在使用lambdas、迭代器块和C#5的
    async
    方法的方法中的闭包变量上

  • 这可能会被优化掉,无论如何,局部变量不必进入堆栈。它可以在寄存器中,也可以完全优化。