0

毕竟指针都是值类型。这就是他们所指向的 - 是引用类型。这是正确的还是什么?

4

3 回答 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 回答