ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 11.12.2025

Просмотров: 3271

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

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

Просто для интересующихся — на прилагаемом компакт-диске имеется де­ монстрационная программа V S D e b u g G e n e r i . e s , в которой вместо хране­ ния a l l S t u d e n t s в A r r a y L i s t используется L i s t < T > , метод O u t p u - t A H S t u d e n t s () оказывается гораздо проще — и все это работает!

Пошаговая отладка

При обнаружении наличия ошибки в программе одним из наилучших первых шагов в ее локализации и устранении является возможность отладчика, известная под названи­ ем пошагового выполнения (single stepping). Для этого воспользуйтесь командой меню

D e b u g ^ S t e p O v e r или клавишей <F10>.

Даже если вы не очень хорошо запоминаете функциональные клавиши, в этом случае следует сделать исключение. Использовать меню Debug для доступа

к пошаговому выполнению Step O v e r и Step Into — непозволительно медлен­

но (панель инструментов лучше меню, но и ей далеко до клавиатуры).

Нажатие <F10> приведет к выполнению демонстрационной программы V S D e b u g до открывающей фигурной скобки функции M a i n ( ) . Повторное нажатие <F10> выполнит функцию M a i n () до первой выполнимой инструкции (executable statement) — инструк­ ции, которая что-то делает на самом деле. Комментарии и объявления такими инструк­ циями не являются, а вот C o n s o l e . W r i t e L i n e () определенно осуществляет некото­ р ы е действия. На рис. 21.15 изображено окно Visual Studio после двукратного пошагово­ го выполнения.

Puc. 21.15. Пошаговый режим приводит к выполнению программы по одной инструкции

514

Часть VII. Дополнительные главы


Перед началом процесса отладки Visual Studio перекомпилирует программу, так что не нервничайте преждевременно.

Обратите внимание, что первая строка программы подцвечена. Это — очередная ин­ струкция, которая будет выполнена в пошаговом режиме. Запомните — желтая строка

еще не выполнена.

Обратите также внимание на окно, открытое внизу, с именем Locals (оно может на­ ходиться в минимизированном состоянии; на рис. 21.15 оно показано открытым).

В этом окне выводится список трех локальных переменных, т.е. переменных, объяв­ ленных в текущей функции. Переменные si и s2 типа V S D e b u g . S t u d e n t имеют зна­ чения n u l l , поскольку им еще не были присвоены значения. Столбец Туре предостав­

ляет информацию о

полном имени класса, включая пространство имен. Переменная

a r g s типа s t r i n g []

(массив строк) с длиной 0 означает, что программе не были пере­

даны аргументы. Это тоже очень важная возможность отладчика.

Еще одно нажатие <F10> приводит к выполнению вывода предупреждения функцией W r i t e L i n e ( ) . Чтобы убедиться в этом, нажмите комбинацию клавиш <Alt+Tab> для того, чтобы переключиться на программу V S D e b u g . В консольном окне вы увидите одну строку — Э т а п р о г р а м м а не р а б о т а е т !. Это именно то, что и ожидалось. Еще раз нажмите <Alt+Tab> для возврата в Visual Studio.

<Alt+Tab>— команда переключения между программами Windows, исполь­ зуемая для передачи управления от одной программы к другой. Она "активизирует" главное окно программы, в которую вы переключаетесь. Когда активен отладчик, программа V S D e b u g выполняется, но находится в приоста­ новленном состоянии. Клавиши <Alt+Tab> можно использовать где угодно, а не только в Visual Studio.

Естественно, очередное нажатие <F10> приводит

к

выполнению

строки

S t u ­

d e n t si

= .... Поток управления останавливается на

следующей строке функции

M a i n ( ) ,

выполняя конструктор первого объекта S t u d e n t за один шаг. Конструктор

всегда выполняется, даже если вы этого и не видите.

 

 

 

 

В окне

Locals переменная

s2 остается равной n u l l ,

но переменная

s i теперь содер­

жит объект класса S t u d e n t .

Небольшой знак "плюс"

слева от si означает, что

объект

можно открыть и посмотреть на его "внутренности". После щелчка на этом значке окно Locals приобрело вид, показанный на рис. 21.16, раскрывая содержимое объекта s i .

Первая и вторая записи в экземпляре объекта — члены n I D типа i n t и s S t u d e n t - N a m e типа s t r i n g . Третья запись — заголовок списка статических членов класса— в данном случае это единственный член данных a l l S t u d e n t s типа A r r a y L i s t . По­ скольку данный объект также имеет свое содержимое, слева от него находится малень­ кий значок "плюс", позволяющий ознакомиться с этим содержимым.

Взгляните внимательнее на значения двух членов экземпляра: s S t u d e n t N a m e имеет значение " S t u d e n t 1 " , которое выглядит вполне корректно, a n I D имеет значение О, что корректным не назовешь. Это значение должно быть равно 1 — значению, передан­ ному конструктору. Что-то в конструкторе пошло не так...

Беспокоясь о программировании на С# вообще и о своей карьере в частности, я вы­ бираю команду меню Debug<=>Stop Debugging. Затем я нажимаю <F10> три раза: один раз для перезапуска программы, и два раза для того, чтобы пройти W r i t e L i n e () —

Глава 21. Использование интерфейса Visual Studio

515


тут, похоже, все нормально работает. Но вместо того чтобы нажать <F10> еще раз и вы­ полнить конструктор, не заходя в него, я нажимаю <F11> и вхожу в конструктор.

Рис, 21.16. Окно Locals позволяет получить детальную информацию о со­ стоянии объекта

Действие клавиш <F10> и <F11> идентично, когда вы выполняете инструкцию, не являющуюся вызовом функции некоторого вида. Пошаговое выполнение по­ средством <F11> (step into) приводит к пошаговому выполнению вызываемой функции. Однако оба пошаговых режима не позволяют заходить в библиотечные функции .NET. Исходный текст реализации библиотеки закрыт для входа.

В этот раз в окне появляется конструктор с выделенной первой строкой. Далее следу­ ет открыть интересующий объект t h i s в окне Locals. Затем несколько раз нажать <F10>, чтобы перейти к точке инициализации n I D .

Каждое изменяемое значение в окне Locals выделяется красным цветом.

Весь в ожидании, я нажимаю <F10> еще раз. Интересно— значение t h i s . n I D не изменяется, несмотря на то что значение n I D в окне Locals стало равным 1.

Если вы скомпилируете демонстрационную программу V S D e b u g с использо­ ванием команды D e b u g ^ B u i l d V S D e b u g вместо применения клавиши <F10> для пошагового прохода в отладчике, в окне Error List вы увидите два упомя­ нутых предупреждения. Если вы посмотрите на конструктор класса S t u d e n t , то увидите волнистую пурпурную линию под присваиванием n I D = n I D , ука­ зывающую на проблему. Если бы вы сделали это перед тем, как переходить к отладке, возможно, вы бы смогли исправить ошибку, не прибегая к отладчи­ ку. К сожалению, эта линия не видна на рис. 21.16, так как на нем показан код в отладчике.

516

Часть VII. Дополнительные главы


Вернемся к анализируемой строке. Следующее выражение просто присваивает значе­ ние n I D самому себе:

n I D = n I D ;

Это законно, но бесполезно и совсем не то, что требовалось. Вот что было нужно на самом деле:

t h i s . n I D = n I D ; / / П р и с в а и в а н и е а р г у м е н т а п е р е м е н н о й - ч л е н у

Можно прекратить отладку и перекомпилировать программу, после чего, по­ местив курсор над этим присваиванием, посмотреть еще раз на предупрежде­ ние во всплывающем окне. Оно гласит "Assignment made to same variable; did you mean to assign something else?" ("Выполняется присваивание той же пере­ менной. Не намеревались ли вы выполнить иное присваивание?"). Можно ли выразиться понятнее?

Можно попробовать изменить строку на t h i s . n I D = n I D и снова пошагово вы­ полнить программу. (С некоторыми ограничениями вы можете также просто изменить исходный текст и продолжить отладку — эта возможность Visual Studio называется Edit and Continue — поищите информацию о ней в справочной системе.)

В этот раз следует аккуратно проверить объекты si и s2 в окне Locals после их кон­ струирования, но, кажется, все выглядит хорошо. Однако пошаговое выполнение оче­ редного вызова W r i t e L i n e () дает странный вывод на экран:

Э т а п р о г р а м м а н е р а б о т а е т ! S t u d e n t 1 =

Что могло случиться на этот раз? Вероятно, T o S t r i n g () ничего не возвращает. Не­ обходимо начать сначала, так что пока что я прекращаю отладку.

Главное - вовремя остановиться

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

Отладчик Visual Studio позволяет указать, что вы хотите остановить программу в ее конкретной точке. Это достигается путем создания так называемой точки останова (breakpoint).

Для этого нужно щелкнуть мышью на области слева от интересующей команды W r i t e L i n e ( ) , где предполагается приостановить выполнение программы. Возле стро­ ки появляется маленький красный кружок, а сама строка подцвечивается красным цве­ том, что свидетельствует о наличии точки останова. Теперь можно указать программе, что она может начинать выполнение, посредством команды меню D e b u g ^ S t a r t или кла­ виши <F5>. В результате ни о чем не нужно беспокоиться, зная, что программа остано­ вится, дойдя до указанной строки.

Как и должно быть, программа начинает работу и останавливается в заданной точке, как показано на рис. 21.17. Обратите внимание на желтую стрелку, появляющуюся в красном кружке, и на подцвечивание инструкции W r i t e L i n e () желтым цветом.

Далее следует вновь три раза нажать <F10>, чтобы добраться до инструкции W r i t e ­ L i n e ( ) , которая выводит информацию о студенте 1, и затем — <F11>, чтобы попасть в метод T o S t r i n g ( ) .

Глава 21. Использование интерфейса Visual Studio

517


Рис. 21.17. Желтая стречка указывает, где остановилась программа из-за наличия точки останова

Я не должен был передавать результат вызова S t r i n g . F o r m a t О оператору re­ t u r n , как показано в следующей строке:

r e t u r n S t r i n g . F o r m a t ( " { 0 } ( { l } ) " , s S t u d e n t N a m e , n I D ) ;

Вместо этого следовало бы переписать T o S t r i n g () с использованием временной переменной s:

p u b l i c o v e r r i d e s t r i n g T o S t r i n g ( )

{

s t r i n g s = S t r i n g . F o r m a t ( " { 0 } ( { l } ) " , s S t u d e n t N a m e , n I D ) ; r e t u r n s ;

}

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

Нажмите < F U > для пошагового выполнения строки, вычисляющей значение s — строки, возвращаемой функцией T o S t r i n g ( ) . В окне Locals все выглядит вполне кор­ ректно, как видно из рис. 21.18. (Примечание: \ t , которое вы видите в строке з, пред­ ставляет собой символ табуляции. Я нажал <ТаЬ> вместо пробела, когда вводил строку S t r i n g . F o r m a t . На самом деле в этом нет ничего страшного. Вне отладчика выберите команду меню E d i t ^ A d v a n c e d ^ S h o w White Space для того, чтобы вместо пробелов выводилась точка, а вместо символов табуляции — стрелочка. Отключить этот режим можно аналогичным способом.)

Неприятность найдена

Проблема должна заключаться в самом вызове W r i t e L i n e ( ) . Следует дважды на­ жать <F10>, чтобы вернуться к этой строке. Ага! Управляющий элемент { о } , который

518

Часть VII. Дополнительные главы