- オブジェクト emp がメモリに格納されている場所、つまりスタックまたはヒープとその方法は?
質問の言葉遣いが悪い。オブジェクトemp
ではありません。オブジェクトへの参照を含む変数です。emp
それでは、質問を言い換えましょう:
1 (a) によって参照されるオブジェクトは、emp
メモリ内のどこに格納されていますか?
変数によって参照されるオブジェクトemp
は、「ヒープ」とも呼ばれる長期ストレージに格納されます。
1 (b)emp
は変数であるため、格納場所を表します。その保存場所はメモリ内のどこにありますか?
質問は、言うのに十分な情報を提供しません。変数emp
は、静的フィールド、インスタンス フィールド、またはローカル変数のいずれかです。(セミコロンがあるため、仮パラメーターにすることはできません。) ローカルの場合は、ラムダの閉じた外部変数、イテレーター ブロックのローカル、または非同期メソッドの可能性もあります。これらはすべて、変数のストレージが短期ストレージか長期ストレージかに関係なく変化します。短期ストレージにある場合は、スタック上にあるか、レジスターである可能性があります。
2name
およびage
変数はメモリのどこに、どのように保存されますか?
これらはクラスのフィールドであるため、これらの変数に関連付けられたストレージの場所は常に長期ヒープ上にあります。
name
は型であるためstring
、それが参照するもの (文字列) もヒープ上にあります。(または、変数が null である可能性があり、その場合は何も参照されません。)
3 このステートメントの各単語は何をしますか、つまり従業員は何をしますか..then emp..then =.. then new.. then employee.. then ()..then ;
質問の言葉遣いが非常に悪いです。まず、それらは「言葉」ではなく、「トークン」です。(And()
は2 つのトークンです。) 第二に、質問の「行う」が何を意味するのかが完全に不明です。では、別の質問をしましょう。
3 この宣言が実行時に実行されるときに実行される操作を詳細に記述します。
質問に十分な情報がないため、正確には言えません。質問はそれがステートメントであると言っているので、フィールド宣言ではありません。簡単にするために、それが iterator ブロックまたは async メソッド内になく、 local が匿名関数の外部変数ではないと仮定しましょう。
まず、変数に短期ストレージが割り当てられます。登録される可能性があります。そうでない場合は、スタックに置かれます。null 参照が割り当てられます。
次に、メモリ アロケータは、ヒープ上の Employee のインスタンス用に空のメモリを生成するように求められます。そうし、そのメモリへの参照を生成します。
第 3 に、これが Employee を初めて見た場合で、Employee に静的コンストラクターがある場合は、静的コンストラクターが実行されます。
4 番目に、静的 ctor が完了すると、Employee のフィールド初期化子が実行されます。
5 番目に、Employee の基本クラス コンストラクターが実行されます。これにより、他の静的コンストラクターが実行される可能性があります。
6 番目に、Employee のコンストラクタ本体が実行されます。
7 番目に、コンストラクターが完了し、現在初期化されているオブジェクトへの参照がそのストレージにコピーされます。
もちろん、これはすべて、途中で例外がスローされなかったことを前提としています。
4 上記の文と の違いは何Employee emp;
ですか? メモリ割り当てに関して教えてください。
質問には、正確な回答を得るのに十分な情報が含まれていません。ローカル変数が使用されていない場合、コンパイラは自由に最適化して削除できます。最適化されない場合、ストレージemp
は短期間のプールから割り当てられ、null に初期化され、使用されることはありません。