NullReferenceException に null に関する情報が含まれていないのはなぜですか? 質問する

NullReferenceException に null に関する情報が含まれていないのはなぜですか? 質問する

NullReferenceException に、基本クラスのデータ (スタック トレースなど) 以外のランタイム固有の情報が含まれないようにした設計上の決定は何でしたか? また、式のどの部分が null であったかをすぐに知らせてくれる Visual Studio の拡張機能はありますか?

ベストアンサー1

NRE は非常に低レベルの例外です。これは、64K 未満のアドレスからデータを読み取るように要求されたときにプロセッサによって生成されるハードウェア例外 (「トラップ」) です。仮想メモリ空​​間のその領域は、ポインター バグをトラップするために常にマップされていません。これは AccessViolation として始まり、アドレスが 0x00010000 未満になると CLR によって NRE に変換されます。その時点では例外のコンテキストはほとんどなく、わかっているのはトラップの原因となったマシン コード命令のアドレスだけです。

マシンコード命令アドレスをプログラム内の名前付き変数にリバースエンジニアリングすることは不可能です。そのように動作することが重要です。ジッターは生成する必要があります。とてもそうでなければ、非効率的なコードになります。合理的に実行できるのは、ソース コードの行番号を復元することだけです。そのためには、行番号情報を含むデバッグ情報 (.pdb) が必要です。CLR は .pdb ファイルの読み取り方法を認識しており、それを使用して例外のスタック トレースを生成します。ただし、JIT オプティマイザーによって実行される最適化により、コードが移動するため、これは依然として不正確であることがよくあります。デバッグ ビルドの場合のみ、確実に一致します。リリース ビルドの PDB にソース行番号情報が含まれていない理由。これは変更できます。

この問題の解決方法は非常に簡単です。ランタイムに実行させる前に、自分で null をチェックして独自の例外を生成します。テストは非常に安価で、1 ナノ秒未満です。

おすすめ記事