今日、新しい Windows 7 x64 マシンを使い始めたばかりで、デバッグ中に何か新しいことを経験しました。次のように考えることができるコードがあります。
if(/*Some criteria that evaluates to false*/)
{
int weekNum = (int)DateTime.Now.Subtract(_myObject.StartDate).TotalDays/7;
//Do something with weekNum
}
if ブロック内のコードをデバッグしたかったのです。私の現在の状況では、次のステートメントをブロック内の最初の行に設定するだけで、データを基準を満たすようにするよりもはるかに簡単なので、次の実行行を int weekNum に設定します...これにより、null 参照例外が発生します。どうやら、weekNum をインスタンス化していません。右側の式に null がないことを確認し、右側をコピーしてウォッチ ウィンドウまたはイミディエイト ウィンドウに貼り付けることで、結果を正常に取得できることを確認しました。文字通り if(true) に置き換えると、正常に動作します。このようなシナリオで次の実行ステートメントを選択することは、私にとって非常に日常的なデバッグ方法です。なぜこのように振る舞うのですか?
編集:現在のビルド構成が最適化されていないことを確認しました。
編集:別のテスト プロジェクトでこれを再現することはできません。元のコードを変更して方程式からオブジェクトを削除しました。元のプロジェクトで例外を取得する新しい完全なコードは次のとおりです。
private void SelectDefaultLearningUnit()
{
TODLogic.LearningUnit currentLu = null;
//If sce is active get the learning unit for the current week.
if (!_sce.IsCancelled && !_sce.IsCancelled
&& _sce.StartDate <= DateTime.Now
&& _sce.EndDate > DateTime.Now)
{
//Get number of weeks since semester started
int currentWeek = (int)4; //THIS LINE STILL BLOWS UP
//Find the first learning unit for the current week
currentLu = _LearningUnits.Where(lu => lu.StartWeek <= currentWeek && lu.EndWeek >= currentWeek).FirstOrDefault(); //May be null
}
if (currentLu == null)
currentLu = _LearningUnits.FirstOrDefault();
cbLearningUnit.SelectedItem = currentLu;
}
繰り返しますが、if ブロック内で手動で実行を設定した場合にのみ例外が発生します。それ以外の場合はスキップされます。私が見る唯一の違いは、テストプロジェクトの変数に時計を置くと、 currentWeek の値が行に到達するまで0であると表示され、その後割り当てられることです。爆破したプロジェクトでは、現在の週の左側に赤い感嘆符が表示され、値は '' が null であると表示されます。値が 0 であるか、「currentWeek」が未定義であると言うことが予想されます。これが、 currentWeek が「インスタンス化されていない」、つまり存在しないと最初に考えた理由です。