6

ボックス化とボックス化解除とは何ですか? トレードオフは何ですか? しかし、1つのことを理解できません。クラスがあるとします:

class MyClass
{
    public int Value { get; set; }
}

そして、メソッド内で値を取得したい:

void MyFunc(MyClass cls)
{
    int i = cls.Value;
}

ヒープに配置されたクラスとして、Value もヒープに配置されたと思いますか? したがって、操作

int i = cls.Value;

開封ですか?それとも開封じゃないの?

4

4 に答える 4

17

スタックヒープについて考えるのはやめましょう。それは完全に間違った考え方です。「ボックス化」が「ヒープ上」を意味するわけではないため、「ヒープ上」のものはすべて「ボックス化」する必要があります。

スタックとヒープは関係ありません。むしろ、参照について考えてください。 値型の値は、オブジェクトへの参照として扱う必要がある場合にボックス化されます。値型の値への参照が必要な場合は、ボックスを作成し、ボックスに値を入れて、ボックスへの参照を作成します。これで、値型の値への参照ができました。

これを値型の変数への参照と混同しないでください。それはまったく違います。変数と値は 2 つの非常に異なるものです。変数への参照を作成するには、「ref」キーワードを使用します。

于 2012-01-10T20:43:59.270 に答える
10

ボックス化またはボックス化解除は、ヒープまたはスタックに値を格納することとは何の関係もありません。C#プログラミングガイドの「ボクシングとアンボクシング」の記事を読む必要があります。あなたの例では、intをintに割り当てているため、これら2つのいずれも発生しません。

于 2012-01-10T20:25:08.710 に答える
7

どちらunboxingでもありませんboxingint キャストなしで割り当てることを考えると、このコードがコンパイルされることを願っています。つまり、それcls.ValueInteger(int)型です。したがって、に割り当てintますint。ここで行われるのは値のコピーです。

于 2012-01-10T20:24:00.060 に答える
0
int i = 5;
object o = i;   // boxing of int i
int i = (int)o; // unboxing of object o

iオブジェクトのフィールドまたはプロパティではなく、オブジェクト自体に割り当てることに注意してください。それは光の性質に匹敵します。光は、粒子(光子)でできている、または波であると知覚できます。intは、intオブジェクト(参照型)または値型にすることができますintintただし、を直接参照型として定義することはできません。たとえば、型の変数、パラメータ、またはプロパティに割り当てるか、参照型にするためにobjectキャストすることによって、オブジェクトに変換する必要があります。object

于 2012-01-10T20:31:04.673 に答える