2

.Net Frameworkが、宣言されているがインスタンス化されていないオブジェクトの状況をどのように処理するのか知りたいです。

たとえば、次のようなオブジェクトを宣言します

DropDownList ddl;

そしてそれについて何もしません。この変数を使用して何かを実行し、それに関する警告を表示する必要があることはわかっていますが、変数がどこに格納されるかはわかりません。

宣言されたすべての変数のデータを格納するルックアップ テーブルはありますか? または、すべての宣言に仮想参照がありますか?

編集:このオブジェクト宣言にメモリがどのように割り当てられているか知りたかっただけです。

Edit2:ローカル変数であるかどうかにかかわらず、メモリ割り当て構造について話しているだけです。この参照がどこに保存されているか知りたいです。

4

5 に答える 5

6

ddlがフィールドの場合、参照型であるため、の値はddlになります。null

メンバーを呼び出そうとすると、NullReferenceException.

ローカル変数の場合は、単に割り当てが解除されます。

値型はdefault(T)その型の を取得します。

宣言された場所によっては、コンパイラ自体が呼び出しを完全に削除する場合がありますが、これは実装の詳細です。

于 2013-02-22T13:10:56.167 に答える
1

あなたの説明から、ローカル変数について話しているように聞こえます。通常の実装で最適化を行わずにローカル変数を宣言すると、値として参照を使用して、スタック上に領域が予約されます (ほとんどの場合) null

さらに調べたい場合は、クラスを調べることができますStackFrame(私は使用したことがありません)。

于 2013-02-22T13:12:52.293 に答える
1

ローカル変数について話している場合、誰もそれを使用できないため、コンパイラーは単純にそれを最適化して存在しないようにすることができます (初期化せずに使用しようとすると、コンパイラーはエラーで抗議します)。実際、先ほどテストしたとき、.NET 4 コンパイラがこれを行いました。

クラス内のフィールドについて話している場合、オブジェクト構築の一部として、その型のデフォルト値で初期化されます。

于 2013-02-22T13:11:17.447 に答える
1

変数はアセンブリに格納されます。デフォルト値は常に null です。

リリース モード (コンパイラが最適化に設定されている) では、最適化され、どこにも保存されません。

IL とコンパイラのしくみについて詳しく知りたい場合は、ウィキペディアから始めるとよい記事があります。

于 2013-02-22T13:16:14.403 に答える
1

すべての変数は、クラスまたはメソッドに格納されます。クラスに宣言された変数は、 .NET Reflectionを使用して一覧表示できます。

class Class1 { private int i; public string s; }
typeof(Class1).GetFields(BindingFlags.Instance); // returns all instance fields
typeof(Class1).GetFields(); // returns all instance public fields
typeof(Class1).GetProperties(); // returns all instance public properties

メソッドに宣言された変数は、.NET リフレクション メカニズムでは検査できません。

于 2013-02-22T13:16:41.557 に答える