
- •Оглавление
- •Об авторе
- •Посвящение
- •Благодарности
- •Ждем ваших отзывов!
- •Что такое .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
- •Приступая к работе
- •Настройка проекта
- •Обработка счета
- •Создание подключения к событию
- •Рисование доски
- •Запуск новой игры

Если значение spacei ndex отрицательно, ключевого слова namespace в строке нет. aьты dдытннэ .ы ,ыЭту строку надо просто пропустить и вернуть ее неизменной, после чего перейти к следующей строке. В любом случае прочие методы вызывать не надо.
Вызовы методов требуют дополнительного изучения вопроса о том, какие исключения каждый из них может генерировать, затем надо рассмотреть все вызываемые из них методы и так далее, пока не доберемся до окончания этой цепочки.
Где же с учетом всего сказанного следует поместить обработчик исключений? Вы можете захотеть поместить большую часть тела метода FixName spaceLine ( ) в t rу-блок. Но насколько хорошее это решение? Это - низко уровневый метод, так что при необходимости он должен генерировать соб ственные исключения или передавать дальше исключения, сгенерированные в вызываемых им методах. Я бы рекомендовал просмотреть всю цепочку вы
зовов, чтобы выяснить, какой же метод лучше всего подходит для размещения обработчика.
При перемещении по цепочке вызовов постоянно задавайте сами себе во просы из раздела "Вопросы, помогающие при планировании". Что произойдет, если FixNamespaceLine ( ) сгенерирует исключение? Это зависит от того, каким образом результат работы этого метода используется методами, находящимися выше в цепочке. Кроме того, какими неприятностями это чревато? Если вы не сможете "исправить" строки с пространствами имен, будет ли пользователем потеряно что-то важное? Можно ли оставить файл неисправленным (в этом случае можно перехватить исключение пониже в цепочке и сообщить поль зователю о необработанном файле)? Думаю, что основную идею вы поняли. Мораль, вытекающая из всего сказанного, проста: создание обработчика ис ключений требует анализа и раздумий.
Помните, что ебэт,ы вызов метода может привести к генерации ис ключений, например приложению ?тздьы не хватить памяти или
может не оказаться какой-то необходимой для работы приложения ЗАПОМНИ! сборки или библиотеки. В этом случае вы практически ничего не
сможете сделать. . .
Как выяснить, какие исключения генерируются теми или иными методами
Как при вызове некоторого метода из библиотеки классов .NET, та кого как String . IndexOf ( ) - или даже одного из ваших собственных
методов, - узнать, может ли он генерировать исключения?
СОВЕТ
Мьздз, т, жс, сех Вl/ сжкВъоnк, сех Вl/косо, |
C т, |

»Visual Studio предоставляет помощь в виде всплывающих под сказок. Если вы наведете указатель мыши на имя метода в редак
торе Visual Studio, желтая всплывающая подсказка перечислит не только параметры метода и его возвращаемый тип, но и исключе ния, которые он может генерировать.
)) · Есnи у вас есть ХМL-комментарии к вашим собственным ме
тодам, Visual Studio будет выводить эту информацию в под сказках так же, как и для методов .NET. Если вы документируете исключения, которые может генерировать ваш метод, то увидите
их в подсказке. Поместите информацию об исключениях в раздел <exception> в комментарии <sumrnary> для ее вывода во всплыва
ющей подсказке.
)) Еще боnьwе информации содержится в справочной системе.
Если вы найдете метод .NET в справочной системе, то увидите спи сок всех исключений, которые может генерировать данный метод, а также дополнительную информацию, которая во всплывающих под сказках не отображается. Чтобы получить справку по методу, щел кните на его имени в коде и нажмите <F1 >. Можно также добавить аналогичную справку и для собственных классов и методов.
Следует рассмотреть все перечислен ные исключения и реш ить, какие из них, каким именно образом и где обрабатывать.
Последний 111анс перех.в.а_та и.,с ч _ни,-
Программа FactorialException помещает все тело метода Main ( ) - за ис ключением последнего вывода на консоль - в обработчик исключений "по следнего шанса".
При разработке приложения всегда размещайте содержимое метода Main ( ) в trу-блоке, так как Main ( ) - стартовая точка программы, а значит, и конечная точка тоже. (Если вы пишете библиотеку классов,
ояшфищeет предназначенную для повторного использования, о необработанных исключениях можете не беспокоиться : о них должен позаботиться тот, кто эту библиотеку использует.)
Любое неперехваченное ранее исключение добирается до метода Main ( ) . Это последняя возможность перехватить исключение и не дать ему добраться до Windows, когда сообщение об ошибке окажется не слишком вразумитель ным и не даст конечному пользователю понять, что же произошло и как этого избежать.
роок аьoнлК дК ,ь,П(К щ ) ,у ) къъь) ,ПкььdК ькКзоК

! rНОСИЕЕИННЧННЗОВПИПСТ ПОПИКИПО "0.0,. ПИ!ИВН ПЕИ ИЕПcРКИИ ПИС. ЧИПИНИНЕИЕСИrНИ ВИЕВИНОПНПИИПНТИЧОПО!НгП ИТгВНПЕПЗАЧНВНB ИЕВИЕВПИППОЗЕНИ!И ОЗИВНПИСгВНПКИВОПНЕИПВИНИЕЕИВrИСИ!ИКИИЕПНС
ЗАПОМНИ! ИП!ОНЕНСИС ОЗ ИЕПcРКИИПИИгЕИЕВИ ИeОЧИПИННСИИ ВdrТЕХ! ПОПИКИПОЗ ПИНЕИИrНОЧННЕЕС ВИТПИКИИЕПЕРИП!ОНЕНСИР ЕcИ!ЕИВ rНИОЗННЧОПНВН П ОЗСКИПСИЕcОПН rОПСВПСИПН!!ОЕЕ rОcНЧОПНВИcР rНОЧННЕЕСl \ВИ ЕcОПН rО ПОЧЕО!ПОЕВИ !Оc!ПС ППcРКИНВНЕОПИВСгПНППИ !Оr ЕЕВИВН
rОПВОНИПИС.ВОЗ ЕИВЕНСИИИ! И ННЧdЕ!ЗННЗОВКИИП rОЕcИ!П ИЧОТНПЕН !Оc!ИП ПИЕВИ!ЕНПНc Е ЧНrИЕНР ПЕИЗ ИП!ОНЕНСИИ ОЗ ИЕПcРКИИПИСТг ППcРКИНСВИТПИКИИЕПЕР!cС !НcНПИЗТИeОНПНcИЧНИ ЕЕОПИНТИПЕВПОПН ПИС rНОЧННЕЕС.
Генерирующие исключения выражения
n"'1-.. |
_ w ,! |
.(,1"y.9 |
! '1","т"..," |
!1'1#.. |
."..g |
,!1,# |
'1".:> N,1#0!,.9 ! |
||
1"."'1#D.. |
.-,т.."..g |
,#, |
.#-9. ),'1#."..g |
JJn '1#...0 |
)"'1-.g0 |
- )#- .,т! |
,)# |
||
)#'1.#.9# |
"'1),. |
)#'1.#.9 |
N,1#)"'1E.9:> |
),'1#.".." |
# N,1#9"(,1 |
'1!)"'1.9:> |
'1"N,1-т:> |
||
9# ,#, |
!,#N,1#.! |
,#т"" |
|
|
|
|
|
|
|
|
)0 , |
|
. |
r a |
_ и |
|
|
|
|
|
r |
|
|
й |
|
|
|
|
|
r.41 |
),0 |
и |
|
r, |
|
'й1 , |
|
|
|
n9!'1!. |
)#'1.#.9 |
р -,"т# |
9:> |
.-,т..".." |
.#-9:>. |
),'1#."..g |
,#, |
!,#N,1#.! |
|
N,1,"-:> |
|
|
|
|
|
|
|
|
|
|
r |
|
|
и |
|
|
|
|
|
|
|
|
rr и |
|
|
|
|
|
|
|
|
|
|
r, |
|
# , е |
rки |
|
|
ГЛАВА 9 |
яннбьoo) нярo?оeр нбьoo) рон, афр |

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

С п и с к и эл е м е н то в с и с п ол ь з о в а н и е м
п е р е ч и сл е н и и
В ЭТО Й ГЛ А В Е . . .
)) Примеры nеречислеl'lий в реальном·мире )), Соз.q;зние и. п.р11мененv е переуислен111й
)J Использование hереt:iислений для определения флагов
ае)) Исполь ова1-1ие переч!llсленийк част й 1,:1нструкций выбора
.t. Т;з i озиананя вразпоаяояннсo oипнВсненияпрареаакосасаик ченар о акеарн и акеене оп еоонян аознаяoкненнеасниенбоняоом
а заяне кненнеасеяoояннсoипн боняатяаренрарреааиплSаеиелтзнu
снипл е яинспакосoзооаяoкненнеасниеро кеоНеаееееооаиеееення аепас
коаяосoрвткоарос |
рвоп еоонян кненнеасряoояннсoипнВсненияпрарнааяo |
|
одчнл росснрбее |
акееене |
,И -двннябодозианаяoаеиел боняSа |
ПИс б1-1 реааипл г аесв внодаяоакненнеасниелоие зееоро еакосoк
звияароенасoиоеееенnа кояоев оп оенеянер е о кеесоониерр .он носони еоннсееооаяo енасoипл еее няодп однакнмеяoкоснзиви явирбеоиасoиоаяo овнодиолнсркоиееаиеряоеени

Перечисле11 |
ия в реальноN,1 |
мире |
|
|
|
|
|
|
|
|
|
||||||||||||||||
|
|
|
|
|
|
3 |
|
n |
|
|
|
QЖд |
|
|
. ЗЬ |
|
|
|
|
|
|
|
|
|
|
|
|
|
'1!r.41$A |
,'1!6'1 .(,1(,1'1,A |
,!'1-T'1 |
-,D$$ |
-)-N,1.'1 |
- |
'1A...'1 |
|
(,1(,1$'1!(,1 |
|
$ |
|
T!.,!.em |
||||||||||||||
'1A !T'1!-$T-- |
$ , ,A'1A.$-.A'1$-(,1 |
|
|
A'1A.$-.A'1$A |
р |
T!..Ж.- |
|
,!-T!-'1'1.- |
|
,!.em |
|||||||||||||||||
.A,D$- |
,'1A,(,1A |
) |
Б., -,!(,1$'1..!-. |
|
|
'1.'1AA |
D)AT. |
-..-.T-- |
|
|
!,'1$(,1 |
|
$N,1'1.$Ж!.AA |
||||||||||||||
'1.-,'1!-T'1.'1 |
A'1'1,0 ,A'1A.$-.A'1 $. |
$ |
), |
..-T! |
$-,!..N,1-ATA |
|
$0 . |
'1A...'1!(,1 |
|
|
(,1$'1A |
||||||||||||||||
a,'1.,! |
A-.$ Ж, |
., |
$-,..$ |
,A'1A.$-.A'1$- |
|
|
D.AT!. |
) |
'1TA'1'1ATAЕT! |
!Ж'1.'1-.$.$ |
|||||||||||||||||
Ж, |
(,1.--- |
--, |
.!, |
n(,1A-T! |
,A'1A.$-.A'1$g |
D)AT!. |
$O$TA |
D.AT!.!. |
|
,'1-r.41 |
!Ж,.'1! |
||||||||||||||||
$(,1A'1'1! |
T., |
..,$ |
|
. |
'1A...'1!(,1 |
(,1$'1A |
|
,A'1A.$-.-.T |
|
D.AT. |
$ |
-!N,1,..T |
|
|
'1.Ж!'1, |
|
D.A_ |
||||||||||
T!),0 |
T$,!) |
|
|
!,$-.'1$A D)AT!.!r.41! |
|
,'1-r.41. |
$ |
,... |
,-.-T!'1. |
|
D.AT!) |
-(,1 |
,! |
.,'1A-- |
|||||||||||||
ж__ |
|
|
|
1:1 п_т |
1:1Гl |
|
du |
|
dQ |
НdQ__ |
|
o |
|
|
|
|
|
|
|
|
|
||||||
|
Б!..A,D$$ |
|
,'1$'1$(,1 ..T |
'1.N,1'1,A |
|
S!'1(,1, |
|
$ |
), |
(,1!.ATA |
|
,..A |
|
'1A !-!N,1'1.).T. |
|||||||||||||
.T! |
-!N,1,..$ |
!,'1- |
|
$N,1 '1$0 е.,'1$(,1A'1 |
|
'1. |
|
-..TA |
ж_ |
_ |
|
|
|
|
_ |
_ |
жd_ |
_ |
|
d_ |
|||||||
|
пd1:1тd1:1 |
п_До d |
Q |
п dQпп_ |
т |
|
_ |
|
п Н Д тжпт Д |
'1.--, |
.N,1,).AT-- |
|
! |
,..- |
|||||||||||||
-$S$,.D$$ |
.$.,0 |
|
|
!'1r.41. '1$N,1(,1!. |
|
!-,!..,- |
|
|
|
T$,..--$S$,.D$$ |
|
|
-.A,-.T |
|
|
!,'1Aem |
|||||||||||
,A.A'1'1!(,1- |
E.Ж.!'1- |
|
$п ,., ,'1..$.! |
|
|
'1A -$..'1! |
(,1A'1-.T-- |
|
), |
(,1!.ATA |
),'1.N,1$T. |
||||||||||||||||
$0 |
. ,'1$.!.A'1$$ |
,., ,A'1A.$-.A'1$A |
|
е.,'1$(,1A'1 |
)'1-, |
.$ |
,!r.41,. |
|
.$Ж! |
$N,1(,1A'1$T-- |
|||||||||||||||||
-,$-!, |
,-T$ |
D.'1-T) |
|
е..A |
-,$-!, |
|
T$,!. |
|
) |
,..,!(,1 |
|
|
D.'1-T.A |
.'1-, |
|
.$ |
$N,1(,1A'1$T--п |
||||||||||
T., |
.T! |
$0 T.,.A |
(,1!.'1! |
|
),'1.N,1$T. |
,., |
,A'1A.$-.A'1$- |
|
|
|
|
|
|
|
|
|
|
||||||||||
|
'1.,T$.A-,!A |
,!.-A,'1A.'1!A |
|
$-,!..N,1!).'1$A |
|
,A'1A.$-.A'1$. |
|
.,....AT |
|
|
-,$-,$ |
||||||||||||||||
,'1A,(,1A |
T!) |
$.$ |
|
$'1S!'1(,1.D$. |
|
,!T!'1.- |
|
'1-.'1. |
|
)-A(,1 |
.,'1$(,1A'1О ), |
|
'1A -(,1!.ATA |
||||||||||||||
|
|
|
|
у!.(,1n)Оn |
|
'1Q(n)) |
!nП :'1!w(,1. |
wQA)'1!n |
! |
.!'11:1((,1. .(,1wQ.А) |
|||||||||||||||||
п |
и Тлл |
(,1.1:1 A aQ'1(n.Q_ |
|
||||||||||||||||||||||||
)О |
aQ'1(n.Q 9'1(,1n!(n(,1. |
|
! Q'1n)).f\41 |
Q . |
и ТТ |
|
(,11:1. |
aQ'1(n.(,1 |
n'1(,1_!(n(,1._ |
|
Р |
Eo a_t-И |
n_ o -И |
О О |
_._ Q |
w 1,<."!-E |
.$! J1 |
$'1 --($ !- '1"( JJ "'1 91 |