什么时候在.NET Compact框架中分配内存?如果值和参考类型之间存在差异,请详细说明。赞赏文件或确认步骤。
特别要考虑这种情况......
private MyClass item; // here?
public void MyMethod()
{
item = new MyClass(); // or here?
}
答案 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)
这是一个棘手的问题,这让我比我想象的要多得多。 :)
让我们从基础知识开始:
声明变量不会直接为引用类型分配内存*。 确实对值类型执行此操作,因为值类型在声明时初始化。对于引用类型,对象的存储在进入其构造函数时分配。
*什么时候不适用?
null
,但是一旦初始化了对象,分配的内存中就会存在有效的引用。)我强烈推荐这个C-Sharp Corner article关于堆栈和堆分配以获取更多信息。
答案 2 :(得分:0)
我强烈建议您查看Compact Framework Memory Management上的MSDN Webcase。它与它在桌面上的工作原理并不完全相同,本讲座内容包含大量细节和图形,以帮助理解GC堆。