如果类有结构变量,那么它将存储在哪里?

时间:2013-12-10 09:15:27

标签: c# .net c#-4.0

已经清楚since the structs are value types in c#, they are stored on stacka class object is stored on the heap(其参考,当然存储在堆栈上)。

警告:(是的,这可能并非总是如此。感谢@Jon进行更正)但在大多数情况下,是的!

但是,a class one of whose member is of type struct呢?现在,内存模型将如何?

顺便说一句,如何检查某个对象是否位于stackheap

好。一些假设:

  1. 此类在函数内是本地的。
  2. 结构是member而不是variable。 (感谢更正。)

2 个答案:

答案 0 :(得分:6)

类本身将是一个引用类型,因此它的实例将保留在堆上。

作为struct的属性是实例(即对象)的组成部分,因此也将保留在堆上,就像int和{{1该对象的属性。

注意:不会引用enum属性,就像没有对structint属性的引用一样。

答案 1 :(得分:2)

  

很明显,因为结构是c#中的值类型,所以它们   存储在堆栈上,而类对象存储在堆上(它的   参考,当然存储在堆栈上。)

这个假设是不正确的。 值类型仅在它们是本地变量时才会进入堆栈,并且不是闭包/ lambda /匿名方法的一部分。即使这样,如果抖动决定,它们可以放在堆上。

  

但是,哪个类的变量是结构类型呢?现在,   内存模型将如何?

上面的规则应该回答你的问题:因为值类型只能存储在堆栈中,如果它是局部变量,那么类的字段必须放在堆上。

您需要了解的有关价值类型的所有信息: http://blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about-value-types.aspx