2

c# での宣言は、変数を作成するためにメモリを割り当てますか、それともメモリを割り当て、コンストラクタを呼び出してメモリ内の割り当てられた変数を初期化できるようにする new 演算子ですか?

私の理解では、 new 演算子なしで任意の型のコンストラクターを呼び出すことはできません。私は正しいですか?

4

3 に答える 3

19

c# での宣言は、作成する変数にメモリを割り当てますか、それともメモリを割り当て、インストラクターを呼び出してメモリ内の割り当てられた変数を初期化できるようにする new 演算子ですか?

まず、あなたが尋ねていると思う質問をしていることを確認しましょう。値型の場合、変数の格納場所と値の格納場所は同じ storageです。参照型の場合、変数に関連付けられた格納場所には、オブジェクトに関連付けられた格納場所への参照が含まれます。それらは完全に異なります。

次に、「変数」の「宣言」の意味を明確にしましょう。静的フィールド、インスタンス フィールド、ローカル変数、および仮パラメーターにはすべて宣言があります。さらに、ローカル変数と仮パラメーターの割り当てセマンティクスは、それらがラムダの閉じた外部ローカルである場合は異なり、ローカルが非同期メソッドまたは反復子ブロックにある場合もセマンティクスは異なります。

したがって、参照型のローカル変数があり、ローカルには何も凝っていないと仮定しましょう。

void M() { 
    Animal x = new Giraffe();  ...

ローカル変数 x の格納場所は、メソッド M() がアクティブ化されたときに、短期ストレージ (通常はスタックまたはレジスタ) から割り当てられます。

「new Giraffe()」が評価されると、ランタイムは Giraffe に長期ストレージ (GC ヒープ) にメモリを割り当て、そのオブジェクトへの参照をコンストラクタに渡します。コンストラクターが戻ると、参照がローカルに割り当てられます。

そのため、保管場所は2か所あります。メソッドがアクティブ化されている間だけ存続する x の短期的な場所と、参照され、ガベージ コレクターがクリーンアップするまで存続するもののための長期的なストレージがあります。

それでも質問に答えられない場合は、質問を明確にしてください。

new 演算子なしでコンストラクターを呼び出すことはできますか?

「コンストラクター」とは、静的コンストラクターではなく、インスタンス コンストラクターを意味すると想定しています。

「通常の」手段ではありません。

于 2013-04-05T03:43:43.437 に答える
1

仕様のない宣言は、C# で (オブジェクト)null にメモリを割り当てます...

string x;
// x = null in memory

string x = "";
// x = string in memory with value.

MyObjectType x;
// x = null;

MyObjectType x = new MyObjectType();
// x = MyObjectType in memory.
于 2013-04-05T02:39:15.373 に答える