
- •Оглавление
- •Об авторе
- •Посвящение
- •Благодарности
- •Ждем ваших отзывов!
- •Что такое .NET
- •Создание исходной программы
- •Тестовая поездка
- •Каркас программы
- •Комментарии
- •Введение в хитрости панели элементов
- •Повторное использование кода из панели элементов
- •Правила объявления переменных
- •Вариации на тему int
- •Объявление переменной с плавающей точкой
- •Ограничения переменных с плавающей точкой
- •Объявление переменных типа decimal
- •Сравнение десятичных и целых чисел, а также чисел с плавающей точкой
- •Логичен ли логический тип
- •Символьные типы
- •Что такое тип-значение
- •Неизменяемость строк
- •Основные операции над строками
- •Сравнение строк
- •Сравнение без учета регистра
- •Отличие строк в разных регистрах
- •Преобразование символов строки в символы верхнего или нижнего регистра
- •Поиск в строках
- •Как искать
- •Пуста ли строка
- •Удаление пробельных символов
- •Анализ числового ввода
- •Обработка последовательности чисел
- •Объединение массива строк в одну строку
- •Арифметика
- •Простейшие операторы
- •Порядок выполнения операторов
- •Оператор инкремента
- •Сравнение чисел с плавающей точкой
- •Составные логические операторы
- •Вычисление типа операции
- •Типы при присваивании
- •Перегрузка операторов
- •Ветвление с использованием if и switch
- •Инструкция if
- •Инструкция else
- •Как избежать else
- •Вложенные инструкции if
- •Конструкция switch
- •Циклы
- •Цикл без счетчика
- •Правила области видимости
- •Пример
- •Зачем нужны разные циклы
- •Зачем нужны массивы
- •Массив фиксированного размера
- •Массив переменного размера
- •Свойство Length
- •Инициализация массивов
- •Понятие <т>
- •Обобщенные коллекции
- •Инстанцирование пустого списка
- •Создание списка целых чисел
- •Преобразования списков в массивы и обратно
- •Подсчет количества элементов в списке
- •Поиск в списках
- •Инициализаторы массивов и коллекций
- •Выполнение специфичных для множеств задач
- •Создание множества
- •Добавление элемента в множество
- •Выполнение объединения
- •Пересечение множеств
- •Получение разности
- •Не используйте старые коллекции
- •Обход каталога файлов
- •Начало программы
- •Получение начальных входных данных
- •Создание списка файлов
- •Форматирование вывода
- •Вывод в шестнадцатеричном формате
- •Обход коллекций: итераторы
- •Доступ к коллекции: общая задача
- •Использование foreach
- •Формат индексатора
- •Блок итератора
- •Создание каркаса блока итератора
- •Итерирование дней в месяцах
- •Что же такое коллекция
- •Синтаксис итератора
- •Блоки итераторов произвольного вида и размера
- •Обобщенные классы безопасны
- •Обобщенные классы эффективны
- •Очередь с приоритетами
- •Распаковка пакета
- •Написание обобщенного кода
- •Использование простого необобщенного класса фабрики
- •Незавершенные дела
- •Ковариантность
- •Использование механизма исключений для сообщения об ошибках
- •Что происходит при генерации исключения
- •Исключительный пример
- •Что делает этот пример "исключительным"
- •Трассировка стека
- •Советы по написанию кода с хорошей обработкой ошибок
- •Анализ возможных исключений метода
- •Как выяснить, какие исключения генерируются теми или иными методами
- •Генерирующие исключения выражения
- •Работа с перечислениями
- •Создание перечислений с инициализаторами
- •Указание типа данных перечисления
- •Применение перечислений в конструкции switch
- •Процедурные поездки
- •Объектно-ориентированные поездки
- •Определение класса и объекта
- •Определение класса
- •Что такое объект
- •Различие между объектами
- •Работа со ссылками
- •Классы, содержащие классы
- •Определение константных членов-данных и членов-данных только для чтения
- •Передача аргументов методу
- •Передача методу нескольких аргументов
- •Соответствие определений аргументов их использованию
- •Перегрузка методов
- •Реализация аргументов по умолчанию
- •Возврат значения оператором return
- •Кортеж с двумя элементами
- •Создание кортежей более чем с двумя элементами
- •Глава 14 Поговорим об этом
- •Определение методов
- •Определение статического метода
- •Определение метода экземпляра
- •Полное имя метода
- •Ключевое слово this
- •Когда this используется явно
- •Что делать при отсутствии this
- •Использование локальных функций
- •Прочие уровни безопасности
- •Методы доступа
- •Пример управления доступом
- •Выводы
- •Статические свойства
- •Побочные действия свойств
- •Дайте компилятору написать свойства для вас
- •Методы и уровни доступа
- •Замена конструктора по умолчанию
- •Конструирование объектов
- •Непосредственная инициализация объекта
- •Конструирование с инициализаторами
- •Инициализация объекта без конструктора
- •Определение свойств с кодом
- •Определение конструкторов и деструкторов с кодом
- •Определение методов доступа к свойствам с кодом
- •Определение методов доступа к событиям с кодом
- •Наследование класса
- •Более сложный пример наследования
- •ЯВЛЯЕТСЯ или СОДЕРЖИТ
- •Доступ к BankAccount через содержание
- •Отношение СОДЕРЖИТ
- •Заменяемость классов
- •Неверное преобразование времени выполнения
- •Указание конкретного конструктора базового класса
- •Обновленный класс BankAccount
- •Перегрузка унаследованного метода
- •Простейший случай перегрузки метода
- •Различные классы, различные методы
- •Сокрытие метода базового класса
- •Вызов методов базового класса
- •Что неверно в стратегии использования объявленного типа
- •Использование is для полиморфного доступа к скрытому методу
- •Объявление метода виртуальным и перекрытие
- •Получение максимальной выгоды от полиморфизма
- •Разложение классов
- •Абстрактный класс: ничего, кроме идеи
- •Как использовать абстрактные классы
- •Создание абстрактных объектов невозможно
- •Опечатывание класса
- •Реализация интерфейса
- •Именование интерфейсов
- •Наследование и реализация интерфейса
- •Преимущества интерфейсов
- •Тип, возвращаемый методом
- •Что скрыто за интерфейсом
- •Гибкие зависимости через интерфейсы
- •Реализация отношения СОДЕРЖИТ с помощью интерфейсов
- •Определение делегата
- •Пример передачи кода
- •Делегирование задания
- •Очень простой первый пример
- •Более реальный пример
- •Создание приложения
- •Жизненный цикл делегата
- •Анонимные методы
- •Проектный шаблон Observer
- •Что такое событие. Публикация и подписка
- •Как издатель оповещает о своих событиях
- •Как подписаться на событие
- •Как опубликовать событие
- •Как наблюдатели "обрабатывают" событие
- •Сборки
- •Выполнимые файлы
- •Библиотеки классов
- •Создание проекта библиотеки классов
- •Создание автономной библиотеки классов
- •Создание классов для библиотеки
- •Использование тестового приложения
- •Дополнительные ключевые слова для управления доступом
- •protected: поделимся с подклассами
- •protected internal: более изощренная защита
- •Размещение классов в пространствах имен
- •Объявление пространств имен
- •Пространства имен и доступ
- •Использование полностью квалифицированных имен
- •Ссылочные типы
- •Выходные параметры
- •Альтернативные методы возврата значений
- •Работа с переменными out
- •Возврат значений по ссылке
- •Различия типов-значений
- •Когда следует использовать структуры
- •Добавление распространенных элементов структур
- •Управление отдельной записью
- •Добавление структур в массивы
- •Перекрытие методов
- •Определение того, что следует защищать
- •Документирование компонентов программы
- •Разложение компонентов на функции
- •Оценка рисков
- •Аутентификация с использованием входа в Windows
- •Безопасность развертывания
- •Уязвимости сценариев
- •Наилучшие методы защиты приложений Web Forms
- •Получение данных
- •Настройка образца схемы базы данных
- •Подключение к источнику данных
- •Работа с визуальными инструментами
- •Написание кода для работы с данными
- •Использование Entity Framework
- •Где водится рыба: файловые потоки
- •Потоки
- •Читатели и писатели
- •Пример использования потока
- •Как это работает
- •Наконец-то мы пишем!
- •Использование конструкции using
- •Загрузка файла из Интернета
- •Регистрация сетевой активности
- •Графика
- •Перья
- •Кисти
- •Текст
- •Классы рисования и каркас .NET
- •Приступая к работе
- •Настройка проекта
- •Обработка счета
- •Создание подключения к событию
- •Рисование доски
- •Запуск новой игры

)). Какие исключения я должен обрабатывать? Перехватывайте все исключения, для которых вы в состоянии восстановить нормальное состояние. Обязательно попытайтесь найти способ восстановления. В процессе разработки и тестирования необработанные исключе ния будут достигать верхушки вашей программы. Перед тем как передать программу пользователям, исправьте все случаи возмож ного возникновения необработанного исключения. Однако иногда исключение должно потребовать завершения программы, когда си туация безнадежна.
)) Как быть с исключениями, которые проскакивают через мою защиту? В разделе "Последний шанс перехвата исключения" ниже в этой главе рассказывается, как обеспечить перехват таких "парши вых овец':
)) Насколько надежным (безаварийным) должен быть мой код?
Если ваш код работает в системе управления движением воздушно го транспорта, он должен быть очень надежен. Если это утилита на один запуск, можно несколько расслабиться. . .
Советы по написанию кода с хорошей обработкой ошибок
п. |
.".... |
.., ..,.. |
."....4 |
" ."..".-r |
.б .. |
,7L. |
7 |
, ".-б7,.- ... .- |
."., |
.-. |
.."1.-..-..e |
ж."., |
."1" .-. ." |
."." |
4 . |
,7 |
.7., .".,.. |
))
Любой ценой защищайте пользовательские данные. Это самое главное. См. также следующий пункт.
)) Избегайте аварийного останова nроrраммы. Если это возможно,
постарайтесь восстановить функционирование программы, если нет, завершите ее как можно более "мягко". Не позволяйте вашей программе вдруг выдать пользователю нечто невразумительное и прекратить работу. Под мягко имеется в виду предоставление ясных сообщений о том, что произошло и как этого избежать в другой раз, а также закрытие программы с корректным освобождением ресур сов и сохранением пользовательских данных. Пользователи нена видят внезапные аварийные остановы программ.
)) Не позволяйте программе работать, если вы не можете восста новить ее нормальное состояние. Программа может оказаться в нестабильном состоянии, а пользовательские данные - несогласо ванными. Если возможности корректной обработки ситуации нет,
выводите соответствующее сообщение и немедленно завершайте программу вызовом System . Envirorunent . FailFast ( ) . Это не ава
рия, а спланированная остановка.
ГЛАВА 9 Эти исключительные исключения 239

ч)>· Рассматривайте библиотеки классов и приложения по-разному.
.. , В библиотекахклассов позволяйте исключениям достигать вызыва ющего метода, который лучше знает, как справиться с возникшей проблемой. Не оставляйте вызывающий метод в неведении относи тельно того, что произошло. Но в приложении обрабатывайте все ис ключения, какие можете. Главное - чтобы код оставался как можно дольше работоспособным и защищал пользовательские данные без множества несущественных сообщений.
»Генерируйте исключения, есnи по какой-то причине метод не в
состоянии завершить выполнение своей задачи. Вызывающий метод должен знать о том, что возникла проблема (это может быть
1метод выше в стеке вызовов или некоторый метод в коде, написан ном другим программистом и использующим ваш код). Если при проверке корректности входных данных перед их использованием выясняется их непригодность - например, обнаруживается нео жиданное значение null, - по возможности исправьте ситуацию и продолжайте работу; в противном случае сгенерируйте исключение.
»Пытайтесь писать код, который не требует генерации исклю чений, исправляйте ошибки при их обнаружении, не полагаясь на
исключения. Но при необходимости сообщения об ошибках и их об работке как главный метод используйте исключения.
»Старайтесь не перехватывать исключения там, где вы не в со стоянии обработать их максимально корректно, предпочти-
,.,теnьно - с восстановлением работоспособности программы.
Перехват исключения, которое вы не в состоянии обработать, напо минает ловлю осы голой рукой. Большинство методов не содержат обработчики исключений.
>) Тщательно тестируйте свой код, в особенности дnя некор ректных входных данных. Может ли ваш метод работать с от рицательными входными данными? С нулем? С очень большими числами? С пустой строкой? Со значением null? Что еще может со творить пользователь, чтобы вызвать исключение? Какие ресурсы, способные привести к ошибкам, использует ваш код? Файлы, базы данных, URL? (См. два предыдущих пункта.)
·» Перехватывайте как можно боnее конкретные исключения. Не пишите слишком много саtсh-блоков для высокоуровневых классов исключений типа Exception или ApplicationException. Вы ри
скуете не пропустить такие исключения вверх по цепочке вызовов.
»Всегда размещайте обработчик "последнего шанса" в методе
татн е оон иnи в ином месте "на вершине" программы (за ис ключением библиотек классов). В таком блоке можно перехва тить исключение Exception. Перехватывайте и обрабатывайте все
240 ЧАСТЬ 1 Основы программирования на С#

исключения по ходу работы программы, следнего шанса" перехват"отстающих': (См. перехвата исключения"далее в этой главе.)
предоставив блоку "по раздел "Последний шанс
»Не используйте исключения как часть обычного потока выпол нения. Например, не надо использовать исключения как способ вы
хода из цикла или из метода.
»
|
у |
м |
ай |
те |
|
ан |
ии |
|
б т |
|
е |
нных |
кла |
сс |
и |
с |
клю |
|
ений, если |
од |
|
|
о созд |
|
со |
с |
в |
|
|
|
|
ч |
|
||||||
|
|
|
|
|
|
|
|
|
ов |
|
|
|
|
||||||
П |
должны нести |
с собой дополнительную информацию, которая |
|||||||||||||||||
они |
|||||||||||||||||||
может помочь в отладке или предоставить пользователю более ос |
|||||||||||||||||||
мысленное сообщение об ошибке. |
|
|
|
|
|
|
|
длнимнияля пилнeкноа |
импдиенмин м |
дкя лкедомирая лсамедеррпн ломениневие |
|
ямкяенля сиодек - ,RW":- К{ |
КЛ(WК: Л-AW:К |
яопти впе |
|
сбта арлнсбнернпl реозeоданпе |
|
одран алнопратон арРоснираа |
|
:bWЛ-(WКллсимопроа-A |
лалненп |
ЗАПОМНИ!
cАПИОЕТОСЕЕТЕВЗЕТОВЕtВНВСИСB3ЕТИАОП3eВНИНООЕТОСЕВN МЕ1ЕМС3): |
|
|
ЕТОTSЕТСОИВИАОП3eВЗ |
..,.ВЗB ЗВЕТОВЗОB !ВЕТТОЕТСВЕТОМСЕТТВСВХМСЕТИTАН |
|
|
DrЕ ВОП!НЕ ИХ |
НИННМПН3ЕТАНeСАЕТT3ОЕТОСОSЕТtОИНЕТВСtВИАСОПСААС |
|
ВООBЗВНЕТИСОМСЕТТСВВТОT |
eЕТИЕТВПTНОТСИТОЗО..,.И ООЗЗВНЕТССИВПНМ |
oВООBЗВНЕТСcИИl |
|
Анализ возможных исключений метода |
|
|
|
||||
(---!.,(- |
-.#.17t(3 |
-#.!. |
С(.(# |
(-..7>#)(1 |
!) |
-!6#. F#)#,(,!-(.b |
|
omp.-#.)( g.!. |
-!S,!- |
S#,-03 ch(F- -!2.()(( !2,(2!.>(.!- |
(-..7># |
)(3 |
wф
0.
Вf o ф
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
ф |
|
|
|
|
|
|
|
|
|
|
w |
|
|
ф |
|
|
|
|
|
|
|
фw |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
э.! |
-#.!. S,#.-.(-.1#. |
-!2!3 |
>(-.b |
)#.!.!,!F! |
|
|
.!.(и |
S,#.)(2)(>#))!F! |
||||||
..1 |
S!(-.( |
..7>#-!F! |
-.!-( |
oe |
rS |
epS- |
(3.# |
( |
--.(-.( |
-.,!.( |
S,#.-.(-.1r |
||||
7t#3 |
(-1 .!-S()( |
(и - .(>#-.-# |
S |
# |
.-( |
(-#)( |
|
S,!-.,()-.-( |
|
(-#) |
l.#.17 |
||||
t(3 |
|
S,(-#, .#-!)-. |
,(,1 |
# kF.# |
!20>)! |
)(m!.(.-1 |
|
- |
(3.# lМa..7>#-!# |
-.!-! |
|||||
oe |
|
rS |
epS |
|
|
|
|
|
|
|
|
|
|
|
|
ГЛАВА 9 |
Эти исключительные исключения 241 |

242 ЧАСТЬ 1 Основы программирования на С#