.NET 紧凑框架中何时分配内存?如果值类型和引用类型之间存在差异,请详细说明。文件或确认步骤表示赞赏。
特别是,考虑这种情况......
private MyClass item; // here?
public void MyMethod()
{
item = new MyClass(); // or here?
}
.NET 紧凑框架中何时分配内存?如果值类型和引用类型之间存在差异,请详细说明。文件或确认步骤表示赞赏。
特别是,考虑这种情况......
private MyClass item; // here?
public void MyMethod()
{
item = new MyClass(); // or here?
}
内存分配有 3 种不同的方式。
静止的:
这些是在编译时绑定和分配的。例如全局静态变量。
堆栈动态:
这些在运行时绑定并推送到堆栈上。比如函数调用中的局部变量。
堆动态:
现在堆动态也有一些不同的“子类别”,例如隐式和显式,但我不会详细介绍。
当你声明
private MyClass item; // here?
对 MyClass 的引用被压入堆栈。它只是一个参考,仅此而已。那时它的值为空。
public void MyMethod()
{
item = new MyClass(); // or here?
}
正是在这一点上,通过调用“new MyClass()”在堆上显式分配内存,然后 item 引用它。
所以实际上,在你调用 MyMethod 之后你有 2 个变量。一个名为 item 的引用类型,以及堆上的一个未命名变量,item 引用了 MyClass 类型。
这是一个棘手的问题,这让我比我想象的更喜欢它。:)
让我们从基础开始:
声明一个变量不会直接为它在引用类型上分配内存*。它确实在值类型上这样做,因为值类型在声明点被初始化。对于引用类型,对象的存储空间是在进入其构造函数时分配的。
*什么时候不适用?
null
,但是一旦你初始化你的对象,一个有效的引用就会存在于分配的内存中。)我强烈推荐这篇关于堆栈和堆分配的C-Sharp Corner 文章以获取更多信息。
我强烈建议您查看有关Compact Framework 内存管理的 MSDN Webcase 。它与在桌面上的工作方式并不完全相同,本次演讲涵盖了很多细节和图形,以帮助理解 GC 堆。