Mar*_*ell 39
(编辑以涵盖评论中的要点)
要强调:值类型和引用类型之间存在差异和相似之处,但这些差异与堆栈与堆无关,而与复制语义与引用语义无关.特别是,如果我们这样做:
Foo first = new Foo { Bar = 123 };
Foo second = first;
Run Code Online (Sandbox Code Playgroud)
然后是"第一"和"第二"谈论相同的副本Foo
?还是不同的副本?恰好相反,堆栈是一种将值类型作为变量处理的方便有效的方法.但这是一个实现细节.
(结束编辑)
重新整个"值类型进入堆栈"的事情...... - 值类型并不总是在堆栈上;
然后他们进入堆(最后两个实际上只是第一个的异国情况)
即
class Foo {
int i; // on the heap
}
static void Foo() {
int i = 0; // on the heap due to capture
// ...
Action act = delegate {Console.WriteLine(i);};
}
static IEnumerable<int> Foo() {
int i = 0; // on the heap to do iterator block
//
yield return i;
}
Run Code Online (Sandbox Code Playgroud)
此外,Eric Lippert(如前所述)在此主题上有一篇很棒的博客文章
这是一个很好的问题; 我没有在Marc Gravell链接的文章中介绍它.这是第二部分:
每个进程都有一个数据块,由两个不同的可分配内存段组成.这些是堆栈和堆.Stack主要用作程序流管理器,并保存局部变量,参数和返回指针(在从当前工作函数返回的情况下).
与值类型(如结构体)(或基本类型 - 整数,字符等)相比,类非常复杂并且大多数都是非常大的类型.由于堆栈分配应该专注于程序流的效率,因此它不能保持最佳环境.大物件.
因此,为了满足这两个期望,这个分离的架构出现了.
归档时间: |
|
查看次数: |
15179 次 |
最近记录: |