Можно ли «увидеть» итеративную коллекцию цикла foreach в C # при отладке? - PullRequest
4 голосов
/ 05 апреля 2011

Это то, что я часто хотел сделать во время отладки.Если у меня есть строка кода, которая вычисляет коллекцию внутри заголовка цикла foreach:

foreach ( var item in someObject.GetItems( someParameter ) ) {
    ...
}

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

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

Ответы [ 3 ]

9 голосов
/ 05 апреля 2011

Один из вариантов - присвоить его временной переменной перед циклом.

var items = someObject.GetItems( someParameter );
foreach ( var item in items ) {
    ...
}

Это позволит вам проверить items напрямую.

, даже если онобыл четко вычислен и возвращен для того, чтобы цикл мог выполняться.

Проблема в том, что это не так.

Если GetItems является IEnumerable илиIEnumerable<T>, это не может быть оценено.Фактически, «коллекция» может быть бесконечно многочисленной.

3 голосов
/ 05 апреля 2011

Один из способов - просто добавить следующее выражение в окно просмотра

someObject.GetItems(someParameter);

Наведение не будет работать для этого сценария, но явное добавление его в окно просмотра будет. В коде много внимания уделяется оценке выражений при наведении на них, чтобы не оценивать функции. Логика в том, что функции дорогие, могут заблокировать IDE, и мы не хотим, чтобы операция зависания вызывала взаимоблокировку. Часть GetItems этого выражения является оценкой функции, и, следовательно, EE отказывается ее оценивать.

1 голос
/ 05 апреля 2011

Отладчик Visual Studio, к сожалению, не имеет функции для этого.

Обратите внимание, что в общем случае это невозможно. Коллекция может быть блоком итератора со сложными вычислениями; вы бы не хотели, чтобы отладчик оценивал его чаще, чем программа.

Но, конечно, существует очевидный обходной путь для сохранения коллекции в переменной:

var items = someObject.GetItems( someParameter );
foreach ( var item in items ) {
    ...
}

Теперь вы можете посмотреть на items в отладчике. Конечно, применяются те же ограничения - если это сложное перечислимое, отладчик не будет отображать удобный список элементов. Но в общих случаях (например, списки, массивы и т. Д.) Это так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...