UserControl使用的内存是否存储在Heap中?

时间:2012-09-05 20:26:58

标签: c# wpf silverlight memory-management heap

  

可能重复:
  Fields of class, are they stored in the stack or heap?

我正在阅读一篇关于Stack vs Heap的文章(只是为了更新我的知识)。

据我所知,如果我在引用类型(类)中创建值类型,则值类型也将存储在堆中。因为存储的值类型取决于其创建的位置。

但是,当我们创建我们的应用程序(比如WPF / Silverlight)时,当我们创建UserControl时,ViewModel是不是它们也是一个类(一个对象)的引用类型?

所以我有点疑惑,所以无论我在UserControl中创建什么,ViewModel也会在Heap中?

2 个答案:

答案 0 :(得分:4)

  

所以我有点疑惑,所以无论我在UserControl中创建什么,ViewModel也会在Heap中?

是的,这是真的。 UserControl是一个类,因此它的内存及其中的任何变量都将存储在堆上。

这里有两件事:

  1. 这纯粹是一个实现细节。存储内存的位置并不重要。使用语义真的很重要(即:传入方法只复制引用,而不是整个对象等)
  2. 变量值可能会在您使用时复制到堆栈中。有关详细信息,请参阅此(非常详细)answer by Eric Lippert,详细说明存储在类中的字段会发生什么。

答案 1 :(得分:1)

是的,UserControl的类及其包含的所有属性值(即使其中许多是值类型)将存储在堆上。

不要过多担心堆栈与堆。了解以下内容通常就足够了:

  • 存储在堆栈中的对象(包括对堆上对象的引用,即IntPtr值类型)在范围和生命周期内受限于为其创建堆栈帧的调用堆栈层。
  • 存储在堆上的对象的范围和生命周期限制为堆栈或堆上对该对象的任何引用。

现在去代码:)