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

Ситуация была довольно таки простая: есть некий wizard, шаги которого хранятся в поле типа Stack для удобного перемещения вперёд-назад. Естественно, в зависимости от текущего номера шага, нужно было выполнять определённые действия. И вот, после очередного багфикса, пришлось с помощь дебаггера разбираться что же там происходит... Но, при дебагге время от времени (в начале мне было абсолютно непонятно из-за чего это происходит) я получал: System.InvalidOperationException: Stack empty. И это при том, что без дебаггера всё работало! Чтоб разобраться в чем дело, я решил написать маленькое консольное приложение (исходники, как всегда, прикреплены к посту), которое состояло из объявления стека, его наполнения и свойства класса StackItem:

 

Те, кто сталкивался с этим раньше, наверное, уже поняли в чем проблема. Запускаем дебаггер, и после наполнения стека смотрим значения свойства StackItem:

 

Второй раз смотрим значения свойства StackItem:

И здесь произошло самое интересное: при просмотре значения свойства дебаггер выполняет весь код, который находится в конструкции get. Таким образом, при каждом просмотре зачения свойства StackItem, в нашем стеке находилось все меньше и меньше данных. Возможно, для кого-то этот подход и является вполне логичным и очевидным, но не для меня. Ведь могли же в Microsoft предусмотреть это? Но нет, теперь у нас есть такая фича дебаггера, или баг...

А пока, для дебагга подобного кода, приходится использовать конструкцию вида:

 

В этом случае, если переменной i не присвоить другого значения, но она всегда будет хранить в себе число 5.

P.S. Проверял как в VS2008, так и в VS2010. Скорее всего, это фича такая...

DebuggerTest.rar (2.74 kb)


Comments

I.C. United States

Wednesday, July 21, 2010 6:30 PM

I.C.

Именно поэтому, если тебе значение нужно только "для посмотреть", у Stack есть метод Peek().
Smile

e0ne United States

Wednesday, July 21, 2010 7:04 PM

e0ne

Метод Peek(), конечно же, полезная штуковина, но в проекте, где наступил на эти грабли с дебаггером о нем вспоминается далеко не в первую очередь Smile.

Mike Chaliy Ukraine

Wednesday, July 21, 2010 8:17 PM

Mike Chaliy

ИМХО, ситуация "сам дурак". Геттер проперти никогда не подразумевает действия, тем более действия с сайд еффектом. Это просто нарушение правил дизайна АПИ. Поменяй StackItem, на метод GetStackItem() и разночтение уйдет.

develop7 Belarus

Wednesday, July 21, 2010 9:57 PM

develop7

Я бы за геттеры с побочными эффектами (меняющие состояние объекта) отбивал руки минимум по пояс. А лучше по колени.

Michiko Wolgast United States

Thursday, December 22, 2011 4:39 PM

Michiko Wolgast

Please stop this bull. For god's sake, watch this video and see how I can make money starting from scratch. I can make $125 by tonight and so can you if you only watch the video. It's called the  <a href="www.empower-networking.com/.../go.php Network</a> system.

springer spaniels United States

Saturday, January 7, 2012 10:51 PM

 springer spaniels

Then more friends can talk about this problem , community.atom.com/.../03EFBFFFF025012C00008016F4432 , english springer spaniel , english springer spaniels , springer spaniel , springer spaniels

springer spaniels United States

Saturday, January 7, 2012 10:51 PM

 springer spaniels

Then more friends can talk about this problem , community.atom.com/.../03EFBFFFF025012C00008016F4432 , english springer spaniel , english springer spaniels , springer spaniel , springer spaniels

Comments are closed