2

System.ValueTypeはクラスですが、
すべての値型は構造体です。

次のようにValueTypeのインスタンスを作成すると、次のようになります。

System.ValueType foo = 5;

...ヒープまたはスタックに保存されていますか?

4

5 に答える 5

4

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"

ただし、一般的に、構造体は、コンテキストに応じて、ヒープ上またはスタック上に配置できます。率直に言って、どちらも実装の詳細であるため、どちらでも構いません。重要なのは動作です...そして(少なくともボックス化されていない形式では)、構造体に関する重要なポイントは、コピーオンアサインのセマンティクスです。

于 2012-09-20T08:28:16.607 に答える
3

あなたがMSDNページを見ていたなら、あなたはSystem.Valuetypeあなたの答えを見つけたでしょう:

値の型は、構造内でスタック割り当てまたはインラインで割り当てられます参照型はヒープに割り当てられます。参照型と値型はどちらも、最終的な基本クラスObjectから派生しています。値型がオブジェクトのように動作する必要がある場合は、値型を参照オブジェクトのように見せるためのラッパーがヒープに割り当てられ、値型の値がヒープにコピーされます。

于 2012-09-20T08:20:08.140 に答える
2

データ型は、値型と参照型に分けられます。値の型は、構造内でスタック割り当てまたはインラインで割り当てられます。参照型はヒープに割り当てられます。

ソース: http: //msdn.microsoft.com/en-us/library/system.valuetype.aspx

于 2012-09-20T08:20:01.717 に答える
2

すべての値型をスタックに格納できますが(そうです、そう言いました)、とにかく、値型でさえオブジェクトから継承するこの部分は、.NET Frameworkの構築方法のために必要な例外であり、これにより、構造のような完璧な木の保存。

より高度な説明については、EricLippertのブログを確認してください。

http://blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about-value-types.aspx

Eric Lippertのブログからのパラフレーズとして:

  1. 通常、誤って記述されます。ステートメントは、より一般的な「値型は常にスタックに格納される」ではなく、「値型はスタックに格納できる」である必要があります。

  2. ほとんどの場合、関係ありません。私たちは、さまざまな種類のストレージの違いがユーザーから隠されている管理された環境を作るために一生懸命取り組んできました。一部の言語とは異なり、正確性の理由から、特定のストレージがスタックにあるのかヒープにあるのかを知る必要があります。

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

于 2012-09-20T08:20:28.317 に答える
2
于 2012-09-20T08:22:06.127 に答える