System.ValueTypeはクラスですが、
すべての値型は構造体です。
次のようにValueTypeのインスタンスを作成すると、次のようになります。
System.ValueType foo = 5;
...ヒープまたはスタックに保存されていますか?
System.ValueTypeはクラスですが、
すべての値型は構造体です。
次のようにValueTypeのインスタンスを作成すると、次のようになります。
System.ValueType foo = 5;
...ヒープまたはスタックに保存されていますか?
System.ValueType
値型ではありません。値型は、から継承するValueType
ものですが、それ自体ではありませんValueType
。それで:
System.ValueType foo = 5;
ここで5
は、スタックにロードされます。次に、これは(タイプのボックスで)int
ヒープにボックス化されます。次に、オブジェクト参照が参照に割り当てられますfoo
。そのためのILを見ると、これを確認できます。
ldc.i4.5 // push int32 value 5 onto the stack
box int32 // box the value at the top of the stack, type int32
stloc.0 // assign to "foo"
ただし、一般的に、構造体は、コンテキストに応じて、ヒープ上またはスタック上に配置できます。率直に言って、どちらも実装の詳細であるため、どちらでも構いません。重要なのは動作です...そして(少なくともボックス化されていない形式では)、構造体に関する重要なポイントは、コピーオンアサインのセマンティクスです。
あなたがMSDNページを見ていたなら、あなたはSystem.Valuetype
あなたの答えを見つけたでしょう:
値の型は、構造内でスタック割り当てまたはインラインで割り当てられます。参照型はヒープに割り当てられます。参照型と値型はどちらも、最終的な基本クラスObjectから派生しています。値型がオブジェクトのように動作する必要がある場合は、値型を参照オブジェクトのように見せるためのラッパーがヒープに割り当てられ、値型の値がヒープにコピーされます。
データ型は、値型と参照型に分けられます。値の型は、構造内でスタック割り当てまたはインラインで割り当てられます。参照型はヒープに割り当てられます。
ソース: http: //msdn.microsoft.com/en-us/library/system.valuetype.aspx
すべての値型をスタックに格納できますが(そうです、そう言いました)、とにかく、値型でさえオブジェクトから継承するこの部分は、.NET Frameworkの構築方法のために必要な例外であり、これにより、構造のような完璧な木の保存。
より高度な説明については、EricLippertのブログを確認してください。
http://blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about-value-types.aspx
Eric Lippertのブログからのパラフレーズとして:
通常、誤って記述されます。ステートメントは、より一般的な「値型は常にスタックに格納される」ではなく、「値型はスタックに格納できる」である必要があります。
ほとんどの場合、関係ありません。私たちは、さまざまな種類のストレージの違いがユーザーから隠されている管理された環境を作るために一生懸命取り組んできました。一部の言語とは異なり、正確性の理由から、特定のストレージがスタックにあるのかヒープにあるのかを知る必要があります。
不完全です。参照はどうですか?参照は値型でも参照型のインスタンスでもありませんが、値です。それらはどこかに保存する必要があります。それらはスタックまたはヒープに移動しますか?なぜ誰もそれらについて話さないのですか?C#型システムに型がないという理由だけで、それらを無視する理由はありません。