2011-01-07 6 views
12

質問には私のプロセスに関する知識が不足しているかもしれませんが、もう一度質問するといいでしょう。.netでオブジェクト参照エラー例外が発生しない理由は、どのオブジェクトがnullであったかを教えてください。

これらのトラッキングは、スタックトレースがどこから検索を開始するかを知るのに役立ちますが、どのオブジェクトがnullではないかを知るのに役立ちます。

ここでは何が起こっていますか?変数名が実行可能ファイルにバンドルされていないためですか?

+0

ええ、それは本当に刺激的です。私も知りたいです。 –

+0

あなたは知っている、私はそれについて考えたことはありません - 良い質問! –

答えて

5

.NETコード役に立てば幸い

:あなたのローカル変数名がなくなっている、いくつかのローカル変数が完全に排除された可能性があります。完全な最適化+ PDB(または完全なデバッグ)で構築された

.NETコード:ローカル変数名はなくなっている:保存ほとんどのローカル変数名は、いくつかのローカル変数は+なしデバッグ情報

ませ最適化を解消されていないことがあります。

そして、あなたが扱っているものは、まったくローカル変数にないかもしれないことを考慮する必要があります。新しい関数呼び出しを連鎖させている前の関数呼び出しの結果かもしれません。

0

「オブジェクト識別子」はありません。 .NETが "識別子xxxxのオブジェクトがヌル"と言うことはできません。

これらの間違いをしないようにする方法を学びます。心配しないでください。表現を細かく分割するだけで、どのオブジェクトを初期化するのを忘れたのかが分かります。あなたはそのシナリオでそれらを初期化することを学びますし、しばらくすると、その事例は再び起こらないでしょう。

+0

"あなたはこれらの間違いをしないように、心配する必要はありません。 ハハハハハハ!まだありません。他の誰かがこれらの間違いをやめたことがありますか? – jrsconfitto

1

基本的にあなた自身の質問に答えました。コードをコンパイルすると、中間言語(IL)に変換されます。 ILには変数名はありませんが、呼び出されるメソッドの引数はメソッドが呼び出される前にスタックにプッシュされ、currentメソッドの引数とローカル変数はその位置で参照されます。これは、この構造がJITコンパイラがコードを生成するのを助けるためです。

pdbシンボルファイルには、生成されたILとコードの間のマッピングが格納されます。コールスタックの各メソッド呼び出しが参照するコードの行を示します。おそらく、ここに格納されている情報は、どの変数がnullであるかを説明するのに十分なほど詳細ではありません。いずれにしても、コンパイラが生成されたILを最適化することを許可した場合、ILの変数とコードの変数の間に1対1のマッピングは存在しなくなる可能性があります。 、完全な最適化となしデバッグ情報を使用して構築 ロブ

関連する問題