Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Объектно-ориентированное программирование.-6

.pdf
Скачиваний:
6
Добавлен:
05.02.2023
Размер:
4.5 Mб
Скачать

Здесь класс – это класс соответствующего атрибута сборки. Об атрибутах мы будем говорить позже, в § 5.4.

Рис. 2.25 – Обозреватель решений

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

рите п. 4.1.3.

61

Рис. 2.26 – Свойства объектов

Ниже расположено окно свойств объектов (рис. 2.26). Здесь отображаются свойства любого выбранного объекта – решения, проекта, ссылки, исходного файла, компонента в редакторе форм и т.д. Выбрав какой-либо элемент в обозревателе решений, мы можем увидеть его свойства. Серый шрифт используется для свойств, доступных только для чтения, остальные свойства можно изменять. Так, можно изменять имена файлов, действия при построении, псевдонимы ссылок и т.д.

Рис. 2.27 – Окно классов

Переключившись на закладку «Окно классов», можно посмотреть, какие типы описаны в подключенных сборках (а также в сборке mscorlib, которая подключается по умолчанию), а также какие типы описаны в самом про-

екте (рис. 2.27).

2.4.2.Редактор кода

Вредакторе кода для каждого файла создается отдельная закладка (рис. 2.28). Выпадающие списки в верхней части редактора можно использовать для быстрого перехода к описанию типа и его члена.

Код организовать в виде иерархического дерева, отдельные ветви которого можно сворачивать и разворачивать. Можно описывать свои сворачива-

62

емые области кода (см. § 3.6).

Рис. 2.28 – Редактор кода

Доступны стандартные средства редактирования текста – копирование

(Ctrl+C или Ctrl+Insert), вставка (Ctrl+V или Shift+Insert), вырезание (Ctrl+X

или Shift+Del), удаление (Del), поиск (Ctrl+F, F3 для повторного поиска), замена (Ctrl+H), отмена (Ctrl+Z или Alt+BS), возврат отмененного действия (Ctrl+Y или Alt+Shift+BS). Если выделение отсутствует, команда Ctrl+C копирует, а Ctrl+X вырезает в буфер всю текущую строку. Для удаления фрагмента от текущей позиции и до конца лексемы используется комбинация клавиш Ctrl+Del.

Набор кода происходит в режиме автозавершения ввода. Т.е. когда мы начинаем набор, среда разработки предлагает варианты завершения конструкции. Для вызова списка автоматического завершения также используется комбинация клавиш Ctrl+Пробел (если, например, мы этот список закрыли, но хотим отобразить вновь). Если среди предлагаемых вариантов нет нужного – значит, в программе допущена ошибка. Например, не подключено пространство имен, в котором описан требуемый тип. Или происходит попытка описать метод вне класса, вызвать статический член класса через его экземпляр и т.д.

При вызове метода появляется подсказка о типе и количестве формальных параметров вызова метода. Если метод имеет несколько полиморфных реализаций, можно их пролистывать, выбирая нужную (рис. 2.29). Если окно с подсказкой закрылось, можно отобразить его вновь, используя комбинацию клавиш Shift+Ctrl+Пробел.

63

Рис. 2.29 – Параметры метода

Также компилятор автоматически форматирует выражения, расставляя пробелы между лексемами и отступы блоков.

Есть некоторые полезные инструменты в меню «Оптимизация кода» – переименование типа или метода, оформление части локального кода в виде метода, преобразование локальной переменной в параметр и т.д. Переименование предлагается редактором автоматически. Когда мы меняем имя класса, метода и других элементов программы, появляется специальный маркер, при наведении на который можно осуществить переименование или переименование с предварительным просмотром результата (рис. 2.30).

Рис. 2.30 – Переименование класса

При помощи кнопок на панели инструментов или подпунктов меню «Правка» → «Дополнительно» можно заключить фрагмент кода в комментарий или выполнить обратное преобразование, уменьшить или увеличить отступ блока кода.

В меню «Правка» → «IntelliSence» имеются более продвинутые инструменты управления кодом (создание заглушек методов, реализация интерфейсов, краткие сведения о типе и т.д.).

Краткие сведения о типе отображаются автоматически в виде всплывающей подсказки при наведении указателя мыши на наименование типа в коде. Но можно вызвать подсказку вручную, используя сочетание клавиш Ctrl+K+I (сначала нажать Ctrl+K, а затем, не отпуская Ctrl, нажать I).

Для вставки фрагмента наиболее часто используемого кода используется комбинация клавиш Ctrl+K+X. Например, для вставки в код вызова ме-

64

тода Console.WriteLine() нажимаем Ctrl+K+X, выбираем в появившемся списке разделов «Visual C#», и далее элемент «cw». Посмотреть имеющиеся фрагменты кода и добавить новые можно в диалоге «Диспетчер фрагментов кода» (меню «Сервис» → «Диспетчер фрагментов кода…» или комбинация клавиш Ctrl+K+B).

При вставке фрагмент кода замещает собой фрагмент, выделенный в настоящий момент. Если, например, нами уже набран код, и мы хотим заключить его в цикл, то используем размещение во фрагменте. Для этого выделяем требуемый код, нажимаем комбинацию клавиш Ctrl+K+S, и выбираем требуемый шаблон (for, foreach, forr и т.д.).

2.4.3. Встроенный отладчик

Если приложение содержит ошибки, то оно не будет построено и запущено. Среда разработки предложит запустить последний успешно построенный вариант, если такой есть (рис. 2.31).

Рис. 2.31 – Ошибки при построении

В принципе, не обязательно запускать компиляцию для обнаружения ошибок. Среда разработки практически сразу выделяет их в тексте программы. Для исправления ошибки, если непонятно, почему она появляется, можно изучить описание ошибки в справочной системе, посмотреть правила синтаксиса используемой конструкции языка C# или изучить спецификации используемого типа.

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

Ошибки и предупреждения, детектируемые компилятором, имеют ха-

рактер ошибок и предупреждений времени разработки (design-time). После того, как они устранены, программу можно запускать на выполнение. В про-

65

цессе работы программы возникают ошибки другого рода – ошибки времени исполнения (runtime errors). Для их выявления и исправления используется отладка. Отладка заключается в отслеживании текущих значений локальных переменных и полей типов, а также выяснении путей передачи управления в программе. Для выяснения путей передачи управления производятся такие действия, как просмотр стека вызовов и трассировка.

Нам известно, что при вызове метода B из метода A текущий контекст метода A сохраняется на стеке, чтобы после завершения работы метода B можно было вернуться к выполнению следующей команды метода B. Мы здесь не говорим о процедурах и функциях, т.к. язык C# является чисто объектным языком. Также под методами подразумеваются конструкторы, методы доступа к свойствам и т.п. В контекст метода входят адрес возврата, значения локальных переменных и параметров метода. Изучая стек вызовов, можно понять, в каком порядке вызывались методы и с какими параметрами. Особенно это полезно при отладке оконных приложений, когда некоторые методы (события) вызываются диспетчерами сообщений, а не из кода программы. Также стек вызовов дает ценную информацию при отладке рекурсивных вызовов.

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

При отладке можно использовать инструменты CLR или отладчик Microsoft Visual Studio.

2.4.3.1. Отладчик CLR

Для того, что бы можно было отлаживать приложение средствами SDK при сборке проекта из командной строки нужно использовать ключи о включении отладочной информации (табл. 2.1).

Табл. 2.1 – Ключи компилятора для управления отладочной информацией

66

Ключ

Описание

 

 

/debug-

Нет отладочной информации

 

 

/debug

Отладочная информация будет добавлена

/debug+

 

 

 

/debug:pdbonly

Создавать PDB файл с отладочной информацией

 

 

/debug:full

Создать PDB файл и дополнительные отладочные сведе-

 

ния (DebuggableAttribute) для компилятора JIT

 

 

По умолчанию отладочная информация не включается, а если мы ее добавляем, но не указываем тип, используется «full».

Итак, в папке «Samples\2.4» создадим файл «Sample_2_4.cs», поместим в него текст программы «Hello, World!» и откомпилируем его с отладочной информацией. Командную строку компиляции поместим в файл «cs24.bat»:

csc.exe /debug+ Sample_2_4.cs

После компиляции появился исполняемый файл «Sample_2_4.exe» и файл с отладочной информацией «Sample_2_4.pdb».

Рис. 2.32 – Инструмент CLR Debugger

67

После этого можно использовать отладчик CLR, размещающийся по следующему пути:

<папка Program Files>\Microsoft.NET\SDK\<версия>\GuiDebug\DbgCLR.exe

Для этого на компьютере должен быть установлен пакет .NET Framework SDK версии не выше 2.0 (т.е. 1.0, 1.1 или 2.0). В отличие от среды вы-

полнения .NET Framework, пакет SDK (Software Development Kit) содержит подробную документацию и примеры программ, а также средства для тестирования и развертывания приложений. Пакет .NET Framework SDK версии 1.1 имеет размер около 100 Мб, версии 2.0 – около 350 Мб. Скачать их мож-

но из центра загрузок Microsoft (microsoft.com/downloads/ru-ru).

На рис. 2.32 изображен интерфейс программы CLR Debugger для .NET Framework SDK 1.1.

Для начала отладки приложения выбираем пункт меню «Debug» → «Program To Debug…». Появляется диалог выбора программы (рис. 2.33). Здесь можно выбрать саму программу, аргументы командной строки и рабочий каталог. Рабочий каталог будет являться текущим после запуска приложения. Это важно, например, при работе с файлами. Если мы при чтении или записи файла указываем его относительную спецификацию, например, «files\1.txt» или «..\dir2\file.bin», то указанные спецификации будут отталкиваться от текущего каталога приложения. Т.е. полные спецификации будут выглядеть так:

<рабочий каталог>\files\1.txt

<рабочий каталог>\..\dir2\file.bin

По умолчанию рабочим является каталог, в котором расположен исполняемый файл.

Рис. 2.33 – Выбор программы

68

Затем открываем исходные файлы (меню «File»→ «Open…», соответствующая кнопка на панели инструментов или комбинация клавиш Ctrl+O)

(рис. 2.34).

Рис. 2.34 – Отладка в CLR Debugger

Далее доступны все те же действия, что и при отладке из Visual Studio. Поэтому подробно рассматривать CLR Debugger мы не будем. Этим инструментом ранее пользовались разработчики, не имевшие лицензионной версии Visual Studio. Однако, в настоящее время доступны бесплатные версии Visual Studio Express.

2.4.3.2. Отладчик Visual Studio

Возможности отладчика Visual Studio соответствуют возможностям отладчика CLR. При трассировке наиболее часто используются следующие команды:

• Переход на следующий шаг с заходом в вызываемые методы («Отладка» → «Шаг с заходом», F11);

69

Переход на следующий шаг без захода в вызываемые методы («Отладка» → «Шаг с обходом», F10);

Продолжить выполнение программы до конца текущего метода («Отладка» → «Шаг с выходом», Shift+F11);

Продолжить выполнение программы до конца или следующей точки останова («Отладка» → «Продолжить», F5);

Прервать выполнение программы («Отладка» → «Остановить отлад-

ку», Shift+F5);

Остановить выполнение программы и перевести ее в состояние трассировки («Отладка» → «Приостановить все», Ctrl+Alt+Break). Это полезно, например, если программа зациклилась, но где – неизвестно;

Установить или убрать точку останова («Отладка» → «Точка останова», F9). Для создания или удаления точки останова можно также щелкнуть мышью по серому полю в левой части окна кода напротив интересующей строки кода.

Рис. 2.35 – Отладка в Visual Studio

Точка останова помечается на сером поле красным кругом, текущая строка при отладке – желтой стрелкой, а строка, на которой было остановле-

70