デバッグ中にイテレータブロックにステップインできない(C#)
-
06-07-2019 - |
質問
ユニットテストプロジェクトから実行されているコードをデバッグしようとしていますが、メソッドにステップインしようとすると、次の行にまっすぐに渡され、そのメソッド内のブレークポイントはヒットしません。このメソッドは別のプロジェクトにあるクラスにありますが、すべてのコードはデバッグモードでビルドされているため、ソリューションのクリーニングと再構築を楽しそうに試みました。
ただし、これは、イテレータブロックをメソッドに追加してからしか発生していません。削除して再構築すると、問題なくステップインできます。奇妙?
Visual Studio 2010 Beta 1を使用していますが、これは単なるバグですか?
解決
イテレータブロックは遅延実行を使用します-つまり、実際にデータの反復処理を開始するまで、何も実行されません。
それで、データは反復されましたか?値をループしているものはありますか?できるだけ早く実行する検証ロジックを追加する必要がある場合、現在2つのメソッドが必要です。
public static IEnumerable<int> GetNumbers(int from, int to) {
// this validation runs ASAP (not deferred)
if (to < from) throw new ArgumentOutOfRangeException("to");
return GetNumbersCore(from, to);
}
private static IEnumerable<int> GetNumbersCore(int from, int to) {
// this is all deferred
while (from <= to) {
yield return from++;
}
}
他のヒント
マークは正しいです。メソッドは遅延実行され、イテレータが実際に実行されるまでメソッドにステップインできません。
ユニットテストでイテレータブロックをデバッグする必要がある場合、次のようにします。メソッドの名前はGetStuffと仮定します。
[TestMethod]
public void TestGetStuff() {
var obj = GetStuffObje();
var list = obj.GetStuff().ToList();
}
.ToList()呼び出しは、イテレーターを強制的に完了させます。次に、GetStuffメソッド内にブレークポイントを設定し、デバッグセッションを開始します
所属していません StackOverflow