在.NET中,诸如int之类的值类型对象存储在内存中。
引用类型对象需要为引用和对象单独分配内存,并且该对象存储在.NET对象堆中。
并且在堆中创建了Array,那么如何在堆中存储诸如int []之类的值类型数组?这是否意味着值类型对象可以存储在堆中而不需要装箱?
答案 0 :(得分:6)
是的,你是对的。我建议你读这个:
http://blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about-value-types.aspx
非常好,它几乎解释了你想知道的一切。
答案 1 :(得分:4)
是的,数组是一种方式,其中值类型值可以存储在堆上而不需要装箱。另一种是将它放在正常的课程中:
public class Foo
{
int value1;
string name;
// etc
}
与Foo
实例关联的所有变量都存储在堆上。 value1
的值只是int
,而name
的值是字符串引用。
这就是为什么“值类型存储在堆栈中,引用类型存储在堆上”的说法显然是不正确的。
但是,由于Eric Lippert是rightly fond of pointing out,堆栈/堆的区别是一个实现细节。例如,CLR 的未来版本可以在堆栈上存储一些对象,如果它可以解决方法终止后不需要它们。
答案 2 :(得分:0)
是的,这意味着没有为到达元素进行装箱,因为整个数组作为一个整体在一个Array对象中被“装箱”(虽然这不是它所谓的)。
实际上并没有要求在放入堆之前必须将值类型装箱。您可以通过三种方式在堆上放置值类型:
将其包装在常规对象中。
拳击它。
将其包装在数组对象中。
(可能会更多的方式,但我认为我没有错过任何方式。)
答案 3 :(得分:0)
用这种方式想一想,内存中的对象位置是由它的类型和声明的位置来定义的。如果对象是值类型,则其值存储在您声明变量的位置。如果对象是引用类型,则其引用存储在您声明变量的位置,而实际对象实例存在于堆上。
声明局部变量时,表示堆栈上的变量。因此,值类型的值将在堆栈上。引用类型的引用将在堆栈上,并且对象实例仍在堆上。
如果在类(引用类型)中声明实例变量,则实际上是在堆中声明实例变量。值类型的值将在堆中(在对象实例中)。引用类型的引用也将在堆中(在对象实例中),对象实例将在堆中的其他位置。
如果在结构(值类型)中声明实例变量,它所在的位置取决于声明底层结构的位置。
对于int int[]
数组,数组是引用类型,您可以将int
值声明为该字段声明为“fields”,这样您的整数就可以有效地存在于堆中。