C# 类的字段,它们存储在堆栈还是堆中?

C# 类的字段,它们存储在堆栈还是堆中?,c#,memory-management,stack,heap,C#,Memory Management,Stack,Heap,我昨天看到一个问题,它(对我)提出了另一个问题。请查看以下代码: public class Class1 { int A; //as I uderstand, int is value type and therefore lives in the stack } class Class2 { Run() { Class1 instance1 = new Class1(); instance1.A = 10; //it points to va

我昨天看到一个问题,它(对我)提出了另一个问题。请查看以下代码:

public class Class1
{
   int A; //as I uderstand, int is value type and therefore lives in the stack
}

class Class2
{
    Run()
   {
       Class1 instance1 = new Class1();
       instance1.A = 10;  //it points to value type, but isnt this reference (on heap)?
   }
}

或者在创建Class1实例时,其字段类型也在堆上创建?但我不明白它什么时候真的会在堆栈上,因为几乎总是需要创建对象的实例才能使用它

本地结构(值类型)变量存储在堆栈上,类的值类型字段存储在堆上。

Ok int是值类型,但'1'(对于类来说是多么糟糕的名称)是引用类型。这意味着“1”的任何实例都在堆上

据我所知,int是值类型,因此存在于堆栈中

你的理解是错误的。值类型称为“值类型”,因为它们是按值复制的。引用类型称为“引用类型”,因为它们是通过引用复制的。“值类型始终存在于堆栈上”这一点都不是真的。如果这是真的,它们将被称为“堆栈类型”和“堆类型”

事实是,这是一个实现细节。不同的框架实现可以随意选择使用堆栈和堆。以下是Microsoft实施如何做到这一点:

  • 引用类型的变量的值是对堆内存的引用。引用基本上是32位或64位整数
  • 值类型的变量的值是其值
  • 局部变量的值存储在堆栈上,除非局部变量位于迭代器块中,或者在匿名方法或lambda表达式的外部变量上闭合。在这些情况下,局部变量的值存储在堆上。当然,除非局部变量可以优化掉,在这种情况下,根本没有存储。或者,它们可以注册,在这种情况下,它们既不在堆栈上也不在堆上,而是在处理器寄存器中
  • 引用类型的实例变量和静态变量的值存储在堆上
清楚了吗

它指向值类型,但这个引用不是(在堆上)吗

字段“A”为值类型。它是一个字段,因此该变量存储在堆上

创建Class1实例时,其字段类型也在堆上创建

实例变量的存储在堆上,是的

但我不明白它什么时候真的会在堆栈上,因为几乎总是需要创建对象的实例才能使用它

它永远不会在堆栈上。正如我上面所说的,堆栈上唯一的东西是局部变量(以及编译器生成的临时变量),它们不是lambda或匿名方法的局部变量,也不在迭代器块中。当然,抖动是自由的,可以使它们完全脱离堆栈,如果有空闲寄存器,则将它们放入寄存器中


但实际上,我不得不问,为什么你关心堆栈上的内容和堆上的内容?放在堆栈上的是我们可以便宜地放在堆栈上的东西;其他所有内容都在堆上。

不允许类名以numberoff topic开头:您的“2”也有无效的类名,请不要忘记分号:)除非(1)局部变量是匿名方法或lambda表达式的外部局部封闭,或者(2)局部在迭代器块中,或者(3)抖动决定使用寄存器而不是堆栈。instance1变量的存储情况如何。它是引用类型,但同时也是函数Run()的本地类型。instance1会保存在堆栈或堆上吗?很抱歉@EricLippert再次发表评论,但我试图编辑我以前的评论,但未能及时完成。为了澄清我的问题,我想问两件事。将保存引用实例1的位置。instance1只是一个引用,其中包含实际对象实例所在的内存地址2。instance1引用的Class1实例将驻留在其中。这里的对象是Class1的一个实例,但在Run()方法中有一个局部作用域。我从John Sharp那里得到了一本书,书中说“值类型在堆栈上创建,而引用类型在堆上”。我也不明白。“实例和静态变量的值存储在堆上。”除了已存储在堆栈上的实例的结构类型实例变量,对吗?“为什么您关心堆栈上的内容和堆上的内容?”-因为一些面试官非常喜欢这样的问题,很多人面试失败,因为到处都写着int变量总是存储在堆栈上,而不是“堆栈上唯一的东西是局部变量”好的一个-
如果这是真的,那么它们将被称为“堆栈类型”和“堆类型”.
@RBT:值类型的字段的值会出现在值类型的值所在的任何位置。