[c#] structに "new"を使用すると、ヒープまたはスタックにそれを割り当てることができますか?



Answers

構造体のフィールドを含むメモリは、状況に応じてスタックまたはヒープのいずれかに割り当てることができます。 struct-type変数が、一部の匿名デリゲートまたはイテレータクラスによって取得されないローカル変数またはパラメータである場合、スタックに割り当てられます。 変数があるクラスの一部である場合、その変数はヒープ上のクラス内に割り当てられます。

構造体がヒープ上に割り当てられている場合、new演算子を呼び出すことは実際にメモリを割り当てる必要はありません。 唯一の目的は、コンストラクタにあるものに応じてフィールド値を設定することです。 コンストラクタが呼び出されない場合、すべてのフィールドはデフォルト値(0またはnull)を取得します。

同様に、スタックに割り当てられた構造体の場合は、C#ではすべてのローカル変数を使用する前にある値に設定する必要があることを除いて、カスタムコンストラクタまたはデフォルトのコンストラクタを呼び出す必要があります(パラメータを持たないコンストラクタは、構造体)。

Question

new演算子を使用してクラスのインスタンスを作成すると、メモリがヒープに割り当てられます。 new演算子を使って構造体のインスタンスを作成すると、メモリがどこに割り当てられますか?ヒープ上またはスタック上にありますか?




構造体はスタックに割り当てられます。 ここで役立つ説明です:

Structs

また、.NET内でインスタンス化されたクラスは、ヒープまたは.NETの予約済みメモリ領域にメモリを割り当てます。 構造体は、スタック上の割り当てのためにインスタンス化されると効率が向上します。 さらに、構造体内のパラメータの引き渡しは、値によって行われることに注意してください。




すべての値型と同様に、構造体は常に宣言れた場所に移動ます。

構造体の使用の詳細については、 hereこの質問を参照してください。 そして、この質問はhereで構造体に関するいくつかの情報があります。

編集:私は彼らがいつもスタックに入ると誤解して答えた。 これはincorrectます。




classまたはstruct宣言は、実行時にインスタンスまたはオブジェクトを作成するために使用される青写真のようなものです。 Personという名前のclassまたはstructを定義すると、Personはその型の名前です。 Person型の変数pを宣言して初期化すると、pはPersonのオブジェクトまたはインスタンスと呼ばれます。 同じPersonタイプの複数のインスタンスを作成することができ、各インスタンスはそのpropertiesfieldsで異なる値を持つことができfields

classは参照型です。 classオブジェクトが作成されると、オブジェクトが割り当てられる変数はそのメモリへの参照のみを保持します。 オブジェクト参照が新しい変数に割り当てられると、新しい変数は元のオブジェクトを参照します。 ある変数で行われた変更は、両方とも同じデータを参照するため、他の変数に反映されます。

structは値型です。 structが作成されると、 structが割り当てられる変数は構造体の実際のデータを保持します。 structが新しい変数に代入されると、 structはコピーされます。 したがって、新しい変数と元の変数には、同じデータの2つの別々のコピーが含まれています。 あるコピーに加えられた変更は、他のコピーには影響しません。

一般に、 classesは、より複雑な振る舞いや、 classオブジェクトの作成後に変更されるデータをモデル化するために使用されます。 構造体は、主にstruct作成後に変更する予定のないデータを含む小さなデータ構造に最適です。

多くのための...




Related