何时在.NET紧凑框架中分配内存?

时间:2008-10-29 18:28:36

标签: .net memory compact-framework

什么时候在.NET Compact框架中分配内存?如果值和参考类型之间存在差异,请详细说明。赞赏文件或确认步骤。

特别要考虑这种情况......

private MyClass item;  // here?

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

3 个答案:

答案 0 :(得分:5)

分配内存的方式有三种。

<强>静态:

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

Stack Dynamic:

这些在运行时被绑定并被压入堆栈。例如函数调用中的局部变量。

堆动态:

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

宣布

private MyClass item;  // here?

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

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

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

因此,实际上,在调用MyMethod之后,您有2个变量。名为item的引用类型,以及堆上的未命名变量,该项引用的类型为MyClass。

答案 1 :(得分:1)

这是一个棘手的问题,这让我比我想象的要多得多。 :)

让我们从基础知识开始:

声明变量不会直接为引用类型分配内存*。 确实对值类型执行此操作,因为值类型在声明时初始化。对于引用类型,对象的存储在进入其构造函数时分配。

*什么时候不适用?

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

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

答案 2 :(得分:0)

我强烈建议您查看Compact Framework Memory Management上的MSDN Webcase。它与它在桌面上的工作原理并不完全相同,本讲座内容包含大量细节和图形,以帮助理解GC堆。