C# の new
演算子による構造体のメモリ割り当て: ヒープまたはスタック?
new
演算子を使用してクラスがインスタンス化されると、メモリがヒープに割り当てられます。ただし、構造体に対する new
演算子の動作は、特定のシナリオによって異なります。違いを見てみましょう:
パラメータを持つコンストラクター
new
を使用して構造体のパラメータ化されたコンストラクターを呼び出すと、メモリがスタックに割り当てられます。これは、値型のローカル変数に値を割り当てることに似ています。
<code class="language-csharp">Guid local = new Guid("");</code>
割り当てられた IL コードは、newobj
を使用してスタックにメモリを割り当て、指定された文字列を使用して値を初期化します。
パラメータのないコンストラクター
new
を使用して構造体のパラメーターなしのコンストラクターを呼び出す場合、動作はコンテキストによって異なります。
スタックにはメモリが割り当てられません。代わりに、initobj
を使用して既存の保存場所 (フィールドまたはローカル変数) を初期化します。値の型はインプレースで構築されます。
<code class="language-csharp">Guid field; ... field = new Guid();</code>
スタック上に一時ローカル変数を割り当て、initobj
を使用して初期化します。この値はパラメータとしてメソッドに渡されます。
<code class="language-csharp">MethodTakingGuid(new Guid());</code>
スタックにはメモリが割り当てられません。値の型は、インスタンスまたは静的変数の格納場所に直接構築されます。
<code class="language-csharp">myInstance.GuidProperty = new Guid();</code>
結論
new
演算子を構造体で使用した場合の代入動作は、コンテキストによって異なります。パラメーターを持つコンストラクターの場合、メモリは常にスタック上に割り当てられます。パラメーターなしのコンストラクターの場合、コンテキストによってはメモリがスタックに割り当てられない場合があります。この動作は、C# コードの変換時にコンパイラによって生成される IL ディレクティブに大きく依存します。
以上がヒープまたはスタック: C# で「new」は構造体をどこに割り当てるのですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。