0

結局のところ、ポインタは値型です。それは彼らが指しているものです-参照型です。それは正しいですか、それとも何ですか?

4

3 に答える 3

1

はい、これは正しいです。すべてのローカル変数は、それらがどのタイプ(値タイプまたは参照タイプ)であるかに関係なく、スタックに格納されます。参照型の変数を作成すると、スタックに保存されます。オブジェクトをインスタンス化してその変数に割り当てると、スタックに格納されている変数によって参照されるメモリがヒープに割り当てられます。

于 2012-09-15T23:33:34.917 に答える
1

参照についてはどうですか?参照は値型でも参照型のインスタンスでもありませんが、値です。それらはどこかに保管する必要があります。それらはスタックまたはヒープに移動しますか? なぜ誰もそれらについて話さないのですか?C# 型システムに型がないからといって、それらを無視する理由にはなりません。

過去に私が通常この神話に反論してきた方法は、本当のステートメントは「デスクトップ CLR での C# の Microsoft 実装では、値がローカル変数またはラムダまたは匿名メソッドの閉じたローカル変数ではなく、メソッド本体が反復子ブロックではない一時的なものであり、ジッターは値を登録しないことを選択します。」

ブログの答えを見つけました。リンクはこちら - 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 に答える