【问题标题】:Is the memory that used by UserControl stores in Heap? [duplicate]UserControl 使用的内存是否存储在堆中? [复制]
【发布时间】:2012-08-30 15:11:36
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 只有值类型可以存储在堆栈中。由于您提到的对象不是值类型,因此它们将始终存储在堆中。
  • 谁在乎呢?无论如何,你不应该介意这样的实现细节......
  • @H.B.我刚刚回答了我之前被问到的关于堆与堆栈的面试问题......我真的很想知道为什么人们会问这个......
  • @KingChan 我认为任何关于堆栈与堆的面试问题的最佳答案,如果它是针对 .NET 工作的,就是讨论为什么它不重要,真正的问题是复制语义.这确实表明您知道自己在说什么,因为堆栈和堆对于 .NET 来说并不重要。
  • @KingChan 也请注意,许多面试官不知道这是一个糟糕的问题,并且会与你争论。不过,这可能是这份工作的一个坏迹象;)

标签: c# wpf silverlight memory-management heap-memory


【解决方案1】:

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

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

这里有两件事:

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

【讨论】:

  • 这真的很详细,哈哈现在我想知道我们什么时候会在堆栈中存储东西......我的意思是几乎每个桌面应用程序都必须创建一个 (Form/UserControl) 并在里面做事,所以就像一切都在堆中......
  • @KingChan 最好不要考虑堆栈和堆 - 但是是的,一般来说,大多数内存使用都在堆中。默认情况下,堆栈只有 1mb - 但大多数程序使用的内存远远超过 1mb :)
  • @KingChan 当您真正存储数据时,它几乎总是在堆上(这就是为什么堆很大而堆栈很小的原因)。堆栈的大部分内容都是短暂的局部变量。您将在您制作的几乎每个程序中创建 很多 个。如果不出意外,堆栈将有很多对程序中堆上存储位置的引用。
  • 有点遗憾,我刚刚了解到 Stack 默认为 1mb :)
  • @KingChan 它是可配置的——在 asp.net 中甚至更小(默认为 256kb)...每个线程都有自己的堆栈分配量。
【解决方案2】:

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

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

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

现在开始代码:)

【讨论】:

    猜你喜欢
    • 2012-04-17
    • 2011-08-25
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 2018-11-14
    • 2018-04-21
    • 2020-12-11
    相关资源
    最近更新 更多