存储在堆栈或堆上的类中的int是什么?

时间:2011-05-13 19:23:11

标签: c# class

  

可能重复:
  Stack & heap understanding question

我在Is using var actually slow? If so, why?告诉我,值类型存储在堆栈中,类类型存储在堆中。

class MyClass
{
  private int myInt;
  private int[] myInts;
}

MyClass.myInt存放在哪里? MyClass是一个类/引用类型,所以它在堆上。 myInt是一个值类型,它存储在某种“内部堆栈”中吗?

另外,阵列怎么样?它是一个价值还是一个阶级?

4 个答案:

答案 0 :(得分:1)

  

值类型被放入堆栈,类类型被放入堆

只有一半是真的,特别是下半场。引用类型存储在堆中,始终为真。

第一部分不是真的,或者有时只是真实的。作为局部变量的值类型存储在堆栈中,但作为类或结构成员的值类型存储在该类型中。装箱的值类型存储在堆上的对象中。

因此,MyClass的实例将包含一个整数和一个引用,并且该类的实例将始终存储在堆上。

数组是一个单独的对象,也将始终存储在堆上。如果实际上有一个数组,那就是。在您创建数组并分配给myInts之前,它是null并且没有数组。

答案 1 :(得分:0)

引用类型中的任何内容都将存储在堆上。该数组可能存储在''MyClass''的非相邻位置,因为它的大小无法在编译时确定。如果你对所发生的事情感到困惑,那么任何优化都不是你现在关注的问题,你可能只会让事情变得更糟,抱歉。

答案 2 :(得分:0)

在方法中声明为局部变量的值类型放在堆栈上。在类中声明值类型时,它是该类的数据的一部分,该类放在堆上。因此,对于您的类实例,myInt将在堆中。当你声明任何数组时,它是一个类,所以它在堆上获得它自己的位置,你的myInts值将是对堆上该对象的引用。

答案 3 :(得分:0)

在谈论引用和值时,它们通常意味着函数中的变量。 您的类代码退出内存的TEXT部分。当您创建一个对象(实例化它)时(对象和所有成员变量)将在Heap中。但是在传递给函数时,可以在Stack上找到对堆上的对象地址的引用。