毕竟指针都是值类型。这就是他们所指向的 - 是引用类型。这是正确的还是什么?
问问题
180 次
3 回答
1
是的,这是正确的。所有局部变量都存储在堆栈中,无论它们是什么类型(值类型或引用类型)。当您创建一个引用类型的变量时,它会保存在堆栈中,当您实例化一个对象并将其分配给该变量时,将在堆上分配一些内存,这些内存将被存储在堆栈中的变量引用。
于 2012-09-15T23:33:34.917 回答
1
参考文献呢?引用既不是值类型也不是引用类型的实例,但它们是值。它们必须存放在某个地方。它们是在堆栈上还是在堆上?为什么从来没有人谈论它们?没有理由仅仅因为它们在 C# 类型系统中没有类型而忽略它们。
过去我通常推翻这个神话的方式是说真正的陈述应该是“在桌面 CLR 上的 Microsoft 实现中,当值是局部变量或值时,值类型存储在堆栈中或不是 lambda 或匿名方法的封闭局部变量的临时变量,并且方法主体不是迭代器块,并且抖动选择不注册该值。”
得到一个博客的答案。这是链接 - Eric Lippert 的博客
于 2012-09-15T23:52:10.553 回答
0
作为对 OP 评论的回应,这里有一个局部变量被转换为类级变量的示例。
如果我从这段代码开始:
void Main()
{
var x = 42;
Func<int> f = () => x;
var y = f();
}
编译器将其转换为以下代码:
void Main()
{
var CS$<>8__locals2 = new <>c__DisplayClass1();
CS$<>8__locals2.x = 42;
Func<int> f = CS$<>8__locals2.<Main>b__0;
var y = f();
}
它创建了以下<>c__DisplayClass1
类:
[CompilerGenerated]
private sealed class <>c__DisplayClass1
{
public int x;
public int <Main>b__0()
{
return this.x;
}
}
为了清楚起见,我对代码进行了一些清理。
于 2012-09-17T00:39:32.343 回答