我正在阅读Jon Skeet的书评,他正在讨论《Head First C#》的众多不准确之处。
其中一个引起了我的注意:
其中一个引起了我的注意:
在什么情况下,结构体会不存储在堆栈上?这与我对结构体的认识相反。[在错误部分]声称结构体总是存储在堆栈上。
在什么情况下,结构体会不存储在堆栈上?这与我对结构体的认识相反。[在错误部分]声称结构体总是存储在堆栈上。
一个常见的例子是,结构体是堆中分配的对象的成员。这里有很多额外的细节问题。 在 .Net 中,结构体和类有什么区别?
int i = 2;
Action action = delegate {i++;}
action();
Console.WriteLine(i);
class Foo {
public int i;
public void Bar() {i++;}
}
...
Foo foo = new Foo();
foo.i = 2;
Action action = foo.Bar;
action();
Console.WriteLine(foo.i);
b: 当值类型变量在迭代器块中使用时:
IEnumerable<int> GetValues() {
for(int i = 0 ; i < 5 ; i++) yield return i;
}
这里举一个例子,来自于1800 INFORMATION的回答:
public class Foo
{
int x;
public Foo(int y)
{
x = y;
}
}
...
Foo foo = new Foo(10);
foo.x
的值为10。 foo.x
在内存中的位置在堆上。 foo.x
的类型是int
,也称为System.Int32
,它是一个结构体。
关于捕获变量和装箱等的其他答案也是正确的(在装箱情况下有点不同-我会添加注释),但是在我看来,这个例子是最简单和最重要的。
已经被其他人深入讨论过了
此外: