Не могу войти в блок итератора во время отладки (C #)

StackOverflow https://stackoverflow.com/questions/1024080

Вопрос

Я пытаюсь отладить свой код, который выполняется из проекта модульного теста, но когда я пытаюсь войти в метод, он просто переходит прямо на следующую строку, и точка останова внутри этого метода не достигается. Этот метод находится в классе, который находится в другом проекте, но весь код построен в режиме отладки, и я попытался очистить и перестроить решение без удовольствия.

Однако это произошло только после того, как я добавил в метод блок итератора. Когда я снимаю его и перестраиваю, я могу вмешаться. Weird?

Я использую Visual Studio 2010 Beta 1, это может быть просто ошибкой?

Это было полезно?

Решение

В блоках итераторов используется отложенное выполнение, то есть до тех пор, пока вы фактически не начнете перебирать данные, ничего не выполняется.

Итак: данные были повторены? Что-нибудь зацикливается на значениях? Если вам нужно добавить логику проверки, которая запускается как можно раньше, вам необходимо два метода:

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 и запускаю сеанс отладки

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top