0

今日、新しい 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 が「インスタンス化されていない」、つまり存在しないと最初に考えた理由です。

4

0 に答える 0