1

.NET 紧凑框架中何时分配内存?如果值类型和引用类型之间存在差异,请详细说明。文件或确认步骤表示赞赏。

特别是,考虑这种情况......

private MyClass item;  // here?

public void MyMethod()
{
    item = new MyClass();  // or here?
}
4

3 回答 3

5

内存分配有 3 种不同的方式。

静止的:

这些是在编译时绑定和分配的。例如全局静态变量。

堆栈动态:

这些在运行时绑定并推送到堆栈上。比如函数调用中的局部变量。

堆动态:

现在堆动态也有一些不同的“子类别”,例如隐式和显式,但我不会详细介绍。

当你声明

private MyClass item;  // here?

对 MyClass 的引用被压入堆栈。它只是一个参考,仅此而已。那时它的值为空。

public void MyMethod()
{
    item = new MyClass();  // or here?
}

正是在这一点上,通过调用“new MyClass()”在堆上显式分配内存,然后 item 引用它。

所以实际上,在你调用 MyMethod 之后你有 2 个变量。一个名为 item 的引用类型,以及堆上的一个未命名变量,item 引用了 MyClass 类型。

于 2008-10-29T18:33:11.230 回答
1

这是一个棘手的问题,这让我比我想象的更喜欢它。:)

让我们从基础开始:

声明一个变量不会直接为它在引用类型上分配内存*。它确实在值类型上这样做,因为值类型在声明点被初始化。对于引用类型,对象的存储空间是在进入其构造函数时分配的。

*什么时候不适用?

  • 在给定类的第一次使用(很可能是您的第一行)时,任何类级别的静态数据都会被初始化,如果该类有一个静态构造函数(它可能会分配内存),它也会被调用。因此,您实际上可以在变量声明中分配一些内存(用于静态成员)。
  • 从技术上讲,声明您的引用类型变量确实在堆栈上分配了一些内存(正如 Nicholas Mancuso 所提到的) - 分配的内存是对对象的引用的堆栈级存储。(不可否认,所说的引用是null,但是一旦你初始化你的对象,一个有效的引用就会存在于分配的内存中。)

我强烈推荐这篇关于堆栈和堆分配的C-Sharp Corner 文章以获取更多信息。

于 2008-10-29T18:39:31.017 回答
0

我强烈建议您查看有关Compact Framework 内存管理的 MSDN Webcase 。它与在桌面上的工作方式并不完全相同,本次演讲涵盖了很多细节和图形,以帮助理解 GC 堆。

于 2008-10-29T23:21:04.287 回答