2011-06-21 22 views
2

すべての型はObjectクラスから派生していますが、値 の型はヒープに割り当てられません。値型変数には、実際には の値が含まれています。これらの型はどのようにして配列に格納され、参照変数を期待するメソッドで使用されますか? 誰かが、配列の一部であるときにこれらの値の型がヒープにどのように格納されるのかを教えてください。配列のメモリの割り当て

+0

[C#in Depth](http://www.manning.com/skeet/)は、開始するのに適しています。 – naveen

+1

私は、値の型の配列は値型ではないと思うので、ヒープに格納されるのは複合オブジェクトのようです。 –

+1

値の種類**をスタックに割り当てることはできますが、必ずしもそうであるとは限りません。これはよくある誤解です。 –

答えて

3

Boxing and Unboxing。配列に関する情報については、特にHereを参照してください。これはオブジェクト配列のためのものであり、値型配列(例:int[])には(un)ボクシングがありません。

1

はこの質問を見てください:

Arrays, heap and stack and value types

あなたがオブジェクト(REFクラスを)期待してメソッドに値型のインスタンスを渡すことができます。この場合、ボクシングとアンボクシングは起こります。

バリュータイプの配列は、ボクシングまたはボックス解除を必要としません!

+0

お返事ありがとうございました。リンクは本当に便利でした。 – Chat

0

CLRは、値型の配列を特別に処理します。もちろん、配列はヒープ上に割り当てられる参照型ですが、値の型の値はヒープレコードに埋め込まれます(スタック上ではありません)。同様

、参照型クラスが値型のフィールドが含まれている場合、フィールドの値をヒープにレコードに埋め込まれている..スタックに割り当てられることができる

+0

返信いただきありがとうございます。私はちょうど答えが十分ではなかったことを知っていたと思います。 – Chat

0

値型。 これは、パラメーターまたはローカル変数、または別の値タイプのフィールドにある場合にのみ発生します。

クラスの配列とフィールドの値の型は、ポインタがそこに格納される代わりにローカルに格納されます。値の型はローカルメモリへのアクセス(パフォーマンス向上)をもたらします。 と配列の場合は、オブジェクトの配列内のボックス化された値も含めて、参照型の配列のオブジェクトでは保証されていないもので、連続性の受領者もいません。参照型の配列では、それは連続的な参照です。

関連する問題