1629295403-b876e2087bddebea4bc9666fb2377a02 (846199), страница 101
Текст из файла (страница 101)
Дополнительные главы////избежать тысячнее работаетписемсуказанием,чтомояпрограммаConsole.WriteLine("Этапрограмманеработает!");S t u d e n t si = new S t u d e n t ( " S t u d e n t 1 " ,1);S t u d e n t s2 = new S t u d e n t ( " S t u d e n t 2",2);//display thetwostudentsConsole.WriteLine("Student 1Console .WriteLine ( "Student 2// Теперьтребуем от класса//студентов=",si.ToString()) ;=",s2.. T o S t r i n g ( ) ) ;Student вывести всехStudent.OutputAllStudents();//Ожидаем п о д т в е р ж д е н и япользователяConsole.WriteLine("Нажмите <Enter> для"завершения"+программы., .
" ) ;Console.Read();}}public{spppclasst a t irivarivaubliStudentc ArrayListallStudentstestringsStudentName;teint nID;c S t u d e n t ( s t r i n g sName,sStudentNamenID = nID;==newintArrayList();nIDsName;allStudents.Add(this);// T o S t r i n g - в о з в р а щ а е т имя и и д е н т и ф и к а т о рpublicoverridestringToString()s t r i n g s = String.Format("{0}({l})",sStudentName,returnpublicстудентаnID);s;s t a t i cvoidOutputAllStudents()IEnumerator i t e r = allStudents.GetEnumerator();// Использую цикл for вместо обычного whilef o r ( i t e r . R e s e t ( ) ;iter.Current! = null;iter.MoveNext()){Students=(Student) i t e r . Current-Console .WriteLine ("Student}={0}",s.ToString());}После удаления из программы всех ошибок времени компиляции можно переходить к делу.Несмотря на то что все ошибки изгнаны, остались еще два предупреждения (они появляются в окне E r r o r List с пиктограммой в виде желтого треугольника).
Предупрежде-Глава 21. Использование интерфейса Visual Studio513ния означают потенциальные проблемы, которые недостаточно серьезны, чтобы считатьих ошибками. Однако это не значит, что их можно игнорировать. Хорошенько изучитеих, поскольку они могут указать на ошибки в вашем коде. Хотя, конечно, расшифровкасообщений компилятора порой труднее, чем расшифровка египетских иероглифов.Просто для интересующихся — на прилагаемом компакт-диске имеется демонстрационная программа 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>.Даже если вы не очень хорошо запоминаете функциональные клавиши, в этомслучае следует сделать исключение. Использовать меню D e b u g для доступак пошаговому выполнению 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 оно показано открытым).В этом окне выводится список трех локальных переменных, т.е.
переменных, объявленных в текущей функции. Переменные s i и s 2 типа 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.< A l t + T a b > — команда переключения между программами 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 переменная s 2 остается равной n u l l , но переменная s i теперь содержит объект класса S t u d e n t . Небольшой знак "плюс" слева от si означает, что объектможно открыть и посмотреть на его "внутренности". После щелчка на этом значке окноLocals приобрело вид, показанный на рис. 21.16, раскрывая содержимое объекта s i .Первая и вторая записи в экземпляре объекта — члены n I D типа iN a m e типа s t r i n g .
Третья з а п и с ь — заголовок списка статическихданном случае это единственный член данных a l l S t u d e n t s типаскольку данный объект также имеет свое содержимое, слева от негокий значок "плюс", позволяющий ознакомиться с этим содержимым.nt и sStudentчленов к л а с с а — в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 D e b u g g i n g . Затем я нажимаю <F10> три раза: одинраз для перезапуска программы, и два раза для того, чтобы пройти W r i t e L i n e () —Глава 21.
Использование интерфейса Visual Studio515тут, похоже, все нормально работает. Но вместо того чтобы нажать <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>для пошагового прохода в отладчике, в окне E r r o r List вы увидите два упомянутых предупреждения. Если вы посмотрите на конструктор класса S t u d e n t ,то увидите волнистую пурпурную линию под присваиванием n I D = n I D , указывающую на проблему. Если бы вы сделали это перед тем, как переходитьк отладке, возможно, вы бы смогли исправить ошибку, не прибегая к отладчику. К сожалению, эта линия не видна на рис.
21.16, так как на нем показан кодв отладчике.516Часть VII. Дополнительные главыВернемся к анализируемой строке. Следующее выражение просто присваивает значение n I D самому себе:nID = nID;Это законно, но бесполезно и совсем не то, что требовалось. Вот что было нужно насамом деле:this.nID=nID;//Присваиваниеаргументапеременной-членуМожно прекратить отладку и перекомпилировать программу, после чего, поместив курсор над этим присваиванием, посмотреть еще раз на предупреждение во всплывающем окне.