0

可能重复:
类的字段,它们是存储在堆栈中还是堆中?

我正在阅读一些关于堆栈与堆的文章(只是为了刷新我的知识)。

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

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

所以我有点想知道,所以无论我在 UserControl 和 ViewModel 中创建什么,也会在 Heap 中?

4

2 回答 2

3

所以我有点想知道,所以无论我在 UserControl 和 ViewModel 中创建什么,也会在 Heap 中?

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

这里有两件事:

  1. 这纯粹是一个实现细节。内存的存储位置并不/不应该真正重要。使用语义才是最重要的(即:传递给方法只是复制引用,而不是整个对象等)
  2. 变量值可能会在您使用它们时被复制到堆栈中。有关详细信息,请参阅Eric Lippert 的这个(非常详细的)答案,详细说明存储在类中的字段会发生什么。
于 2012-09-05T20:29:29.657 回答
1

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

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

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

现在去代码:)

于 2012-09-05T20:32:03.423 回答