-1

私はこのトピックがたくさん答えられることを理解しています。私の質問は、それが言われたり尋ねられたりする方法に固有のものです。

つまり、classキーワードで記述されたコードはマネージヒープ上にあり、参照型であり、構造体で記述されたコードはスタック上にあり、値型であると言うのは正しいですか?

4

2 に答える 2

6

私もこう思っていました。しかし、私は最近Jon Skeetと素敵な話し合いをしました(彼は詳細を提供するかもしれません)そして彼は私にavalue typeもヒープに保持されるかもしれないと説明しました。重要なのは、その変数がどのくらいの期間使用されるかです。短期間の値型変数の場合は、スタックにのみ残されます。ただし、何度も使用する場合、フレームワークはスタックのスペースを節約するためにヒープに保持します。

IMO、参照型と値型の主な違いは、オブジェクトを別のオブジェクトまたはメソッドに渡すことに依存しています。参照型の場合は、単にその参照を共有しているだけです。値型の場合は、そのコピーを作成しています。

短いx長寿命変数の主題について、ここに全体像があります:

デスクトップCLRでのC#のMicrosoft実装では、値がラムダまたは匿名メソッドのクローズドオーバーローカル変数ではないローカル変数または一時変数であり、メソッド本体がiteratorブロック、およびジッタは値を登録しないことを選択します。

出典:値型についての真実(コメントにもあります)

于 2012-08-20T14:32:02.730 に答える
0

参照型の格納場所(ローカル変数、パラメーター、クラスフィールド、構造体フィールド、または配列スロット)は、常にいずれかを保持します。null、またはそれ以外の場合は、ヒープ上のオブジェクトへの参照を保持します。値型の格納場所には、その型のすべてのパブリックフィールドとプライベートフィールドが保持されます(プリミティブ値型は、同じプリミティブ型であると宣言された1つのフィールドを持つ構造として内部的に格納されます。コンパイラの魔法は、その型を操作するために特殊なケースのコードを使用する必要がある場合を認識するために使用されます)。すべての値型には、同じメンバーを持つ対応するヒープオブジェクト型があります。値型を参照型の格納場所に格納しようとすると、適切なヒープタイプの新しいヒープオブジェクトが作成され、値型フィールドの内容が新しいオブジェクトの内容にコピーされ、その新しいオブジェクトへの参照が格納されます。要求された保管場所にあります。このプロセスは「ボクシング」と呼ばれます。それ' ■ボックス化されたヒープオブジェクトのフィールドの内容を、値型の格納場所のフィールドにコピーすることができます。これは「ボックス化解除」と呼ばれるプロセスです。ボックス化された値型は参照型の格納場所を使用してアクセスされるため、クラス型ではなく参照型のように動作することに注意してください。C#は、値型の格納場所の型とボックス化された値型のインスタンスの型が同じ型であるかのように見せかけようとしますが、2つの型の動作は多少異なります。それらが同じであるふりをすることは単に混乱を追加します。C#は、値型の格納場所の型とボックス化された値型のインスタンスの型が同じ型であるかのように見せかけようとしますが、2つの型の動作は多少異なります。それらが同じであるふりをすることは単に混乱を追加します。C#は、値型の格納場所の型とボックス化された値型のインスタンスの型が同じ型であるかのように見せかけようとしますが、2つの型の動作は多少異なります。それらが同じであるふりをすることは単に混乱を追加します。

于 2012-08-20T21:24:58.043 に答える