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

Р ь1 б а л ка в п ото ке
н |
Н ДНо |
Д |
Д |
|
о |
ДН м |
Д |
|
|
о |
Д мН |
|
м |
usingН Н |
нр |
|
|
жГе3 |
|
QQ А |
еА3с#3е аА3#жж3Г евж |
серксв аер Ао#рп9АоОарртс#ртоир9оер осое висбов # мвириоа ТоиеоаАоровр#аора иосеоа lо9оирсоя-ро мв9оерпрмв#рраородиш дреор с9оосоеерспрро9ррерТоАрпрер Гди дреоо Аио9о#9среевС #
АороврАк ерарерр#оиСорорр9тевцо9смоОАиоТирааоиромопреоСоиА4ррртИ
зриаое ярзО1м к 2Ь ч ,Пз11зпп.опербррриоАиререорсреевА ер соиво Ао9ибреороАи соиврх6 ЧроОТ9р#рав ирииаориоаоиео#евроАрирпоо##ош ср7#в#осррвиро#вАтрО9о#я
Где водится рыба: файловые потоки
|
"1(,"1 -(,, |
,()"1JJ()',,, |
. |
(',кл"1,:v,. |
|
,('l1 1, |
. |
,з"1 -_'l(,),(., |
|
, ,s1<',. |
,"1 ,sh |
|||||
1<'.,,кл |
.1Y1"1,(,, |
,'((,, |
, |
,"1(,"1 |
'l |
'l .,."1,,:кл |
(),-,s -кл'кл |
()',з"1кл, |
(' |
,"1(,"1 - |
t()"1 |
|||||
1 1()',,, |
|
.,кл(),1<'.,,v'l,,,: |
|
-' |
,(),,, ','l |
|
,(.JJ'l |
,', |
,()'.'l "1п |
()',з"1кл'.,,кл , |
'. |
|||||
','lg |
|
ж,()"1,:кл("1,кл- |
.,кл(),кл'lкл- . |
(),' -("1, |
|
,'l(), |
,()"1JJ()',,,s |
(, |
()',з"1кл'.,,v,s.,, , |
|||||||
'. ',. |
,"1,"1,кл'.'l,' |
, |
.,()"1,:кл("1,кл-.,, |
.,кл(),кл'lкл- |
. |
',',,,'l1<,, |
|
,"1, |
'l(,кл'lкл,sкл, |
|||||||
(),, ',,s |
|
,'-'l("1 |
. |
'l__, |
|
|
|
|
|
|
|
|
|
|
|
|

имен |
ч5iу |
|
- .рплеюавыриила сыомрОылелклеелср еюелсроеыомтиовырииHи |
у6у"5iй |
|
Пыоиржлтю мрОылавилкирааситслыкмемкллтвиюттллареср. |
1ру, влскле |
|
треысермтмрОыв иржлтмо елпеирармтмклсмивисвтли. Гжющелсмивисвтли |
ЧтлвилитлщсиылевлтлилмсивлытпимтиоеиовсОирпвис щтмесс сп мрОырсыс првсисе емклй
Потоки
|
|
ВTC |
д рlсИВomp |
lNс |
д.NompдNд4.TрКlI |
lI 4e<В |
4C..e<ПI |
Кь.Кс |
|||||||||||||||
l |
|
|
CNl3с. . |
|
|
к |
к |
l. N.ompCNl. |
к |
к |
lNC. |
4. |
ьN.Кс д .. |
||||||||||
|
lN. |
NI |
Cдр. Nl.l3 ь.Кс. |
|
NlIT |
|
|
к |
l ompъ |
N4УNсe<ь.Ксl4 |
К |
||||||||||||
44lI |
|
4T4lI |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
ta!ee |
Ал |
WW!l |
a!,e!, |
,e,;ele!!a,l! |
e!Ba,!ЕТB!!,! |
!ЕТ!,! |
,! |
|||||||||||||
|
|
|
! e,e!,,!M! |
,;!,!al!!,!M!B |
Нt |
!!dMj |
!,;D!t e!,-i!!!ЕТj |
e,al!! |
M,i |
||||||||||||||
|
|
|
!M e!Ba,!,P, !!,!! |
!ЕТ!,!! |
П!, |
,e!,!!,B |
!a!ee |
!!ee!!!!M |
!!l!ЕТB |
||||||||||||||
|
СОВЕТ |
|
! |
!!!!,B |
Pa!!li |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
t,! |
la |
M, |
pБp |
tИ ХПuo,!a,l!e,А |
e,;!!!!l!!!aB!,B |
|
! |
! |
laMlB !!,i |
|||||||||||||
!! |
!!!,!! |
! |
it |
|
n!l!e!!!B |
!l eltl !!!!!!!aB!,l |
dle!!Mlt |
!,!,!,l |
|
!lЕТl!!M!, |
|||||||||||||
!!e a!,j,!,! |
|
!a,,;!!t |
D,! |
l!ЕТta!,!,!,! |
|
a!!,; |
a,d!!lB |
M!l! |
!!,;aa! |
,ts:l!i |
|||||||||||||
!,! |
|
n |
Wi,ts:l |
|
|
|
mmiM!i!i |
|
,D!, |
!!ee!!!!!!!!B |
|
e!Ba !!! |
a,!,! |
||||||||||
t!B!,! |
|
!aMeM |
!,a,!tMa! e!!, !o |
,ЕТl!Ba,j,DMB !! !!!,l |
dle!!Mli |
КИ!!!!l |
|||||||||||||||||
|
!l!,; ! a!,P!!!!,; ! |
M-i!ll i |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
ta!eeЕТ |
|
|
Mea,aBt-i,;l!ЕТl! it |
!!aEЕТ!E! |
!te!!!!!!!B |
|
t!-i,! |
B |
!a!ee |
|||||||||||||
|
o |
WM!,! |
a,!!a!ee,!t |
a!l!!!-i!!ЕТl!!ЕТj |
|
!a, |
!!t,!ЕТ ee!Ba!!M !! |
!Me!lt |
|||||||||||||||
a, el!! |
MaM! |
a!!,!! |
|
l!!! |
!a!ee! |
a,!,!,! |
eal M!aM-iM!,;E!e, !! |
d!e!,!!l |
|
||||||||||||||
! |
!!edMe!,!!l |
|
!!!! |
ЕТjt!!,;PMl a,-i!,a,E! |
|
,;e!,!M!B ,al!! |
MM!!,!! !ЕТ!,!!Дж |
||||||||||||||||
!,!,! |
ЕТl!,P,;! |
t!!B |
,ЕТl!B!l!al!!ЕТ!M |
a!M !ea,aB-i,!!!M! |
!!,;PMj a,!,!,! |
i i |
|||||||||||||||||
t! ,!l |
!,P,t ! ЕТ!,Dl!l |
e!!! |
!,aMeЕТ!!!Ba,!!a!eeЕТt!-i,!,P, |
!a!ee! |
|
|
W |
||||||||||||||||
leaM,;!!e le!B e!,! |
M!lM, !, |
t!!!Ml |
!,! |
ЕТl!!!! |
|
a,!,!,! |
!,P,;! tЕТ!Ba,al-ii |
||||||||||||||||
!ЕТ!!d!! |
a!,P!!!!!! |
|
|
!,!,aDl! |
a!l!,;a!l!!!B |
!!e ЕТ!,e,-i!!!!l |
a,!!a !ee! |
W!la, !l M-ialP!Mjoo
Читатели и писатели
с. |
к к |
эNl рlП.с omp..Кд |
lс |
|
. Nlд рlсИВomp |
C3Tс.К рl |
||||
NlC. р. |
I N.4сe<УъдКl |
lКр.l NlК |
.Вl4 |
КCс. |
|
NC. |
NьИ.Кс В.C. NИ |
|||
р.l |
NдсдИ В.рд .NИ |
сlC .КNl4 |
4lN. |
4 |
|
Nl. |
l |
N4 ..l omp3 lN |
||
N д . . |
В.рд И ь.Ксl4 .. |
omp.l4. |
.КNl4. |
omplсИхNlзl Clсд |
N4... |
|||||
lN |
e<зlN. ..У И |
дВ |
NзИ. |
. NИУ |
. сдlN |
CCс. |
l4 |
44lIдN |
542 ЧАСТЬ 3 Вопросы проектирования на С#

понятия "читателей" и "писателей". Объекты этих типов существенно упроща ют файловый (и прочий) ввод-вывод.
Создавая новы й 2e)eи :, (одного из доступных типов), вы связываете с ним потоковый объект. Для читателя не важно, связан ли поток с файлом, бло ком памяти, местоположением в сети или Миссисипи. Читатель запрашива ет входную информацию из потока, который получает ее. . . словом, откуда-то получает. Использование зг))el :l, практически аналогично, за исключением того, что вы не запрашиваете входную информацию, а передаете выходную, которую поток отправляет в определенное место, которое часто (но не всегда) является файлом. Пространство имен System . IO содержит классы-оболочки для FileStream (или иных потоков), которые упрощают доступ.
» roA(eoс(o6n croA( l6pn(o6n н пара абстрактных классов для чтения символов (текста). Эти классы предоставляются в двух видах (набо рах подклассов): StringReader/StringWriter и StreamReader / StreamWriter.
Поскольку TextReader и TextWriter - абстрактные классы, для реальной работы используется одна из пар их подклассов, обычно
StreamReader/StreamWriter. О том, что такое абстрактные клас
и n (oм.к, сы, рассказывалось в части 2, "Объектно-ориентированное про- граммирование на С#".
»StreamReader/StreamWriter - более интеллектуальные клас сы чтения и записи текста. Это конкретные классы, которые можно использовать для чтения и записи непосредственно. Например, класс StreamWriter имеет метод Wri teLine ( ) , очень похожий на метод класса Console. StreamReader имеет соответствующий ме тод ReadLine ( ) и очень удобный метод ReadToEnd ( ) , собирающий весь текстовый файл в одну группу и возвращающий счита нные символы как строку string (которую вы можете затем использо вать с классом StringReader, циклом foreach и т.п.). Классы имеют различные конструкторы, о которых можно прочесть в справочной системе. С применением StreamReader и StreamWriter в деле вы встретитесь в следующих двух разделах.
Одна очень приятная особенность классов читателей/писателей, таких как StreamReader и StreamWriter, в том, что их можно использовать с любым ти пом потоков. Это делает чтение и запись MemoryStream не сложнее, чем чтение и запись одного из подвидов FileStream (мemoryStream будет рассмотрен не много позже в данной главе). Другие пары читателей/писателей вы найдете в разделе "Еще о читателях и писателях".
В следующих разделах будут рассмотрены программы F i l eWri te и FileRead, которые демонстрируют способы использования упомянутых клас- сов читателей и писателей для текстового ввода-вывода.
ГЛАВА 25 Рыбалка в потоке ездn

АСИН ХРОННЫЙ ВВОД-ВЫВОД: ЕСТЬ Л И ЧТО-ТО ХУЖЕ ОЖИДАН ИЯ?
Обычно программа ожидает завершения ее запроса на ввод-вывод и только затем продолжает выполнение. Вызовите метод read ( ) , и в общем случае вы не получите управление назад до тех пор, пока
данные из файла не будут считаны. Такой способ работы называется синхрон ным вводом-выводом.
Классы С# Systern . IO поддерживают также асинхронный ввод-вывод. При ис пользовании асинхронного ввода-вывода вызов read ( ) тутже вернет управ ление программе, позволяя ей заниматься чем-то еще, пока ее запрос на чте ние данных из файла выполняется в фоновом режиме. Программа может про верить флаг выполнения запроса, чтобы узнать, завершено ли его выполнение.
Это чем-то напоминает варианты приготовления гамбургеров. При синхрон ном изготовлении вы нарезаете мясо и жарите его, после чего нарезаете лук и выполняете все остальные действия по приготовлению гамбургера. При асин хронном приготовлении вы начинаете жарить мясо и, поглядывая на него, тут же, не дожидаясь готовности мяса, режете лук и делаете все остальное.
Асинхронный ввод-вывод может существенно повысить производительность программы, но при этом вносит дополнительный уровень сложности.
И |
о |
ьз |
ова |
н |
и |
е |
.Л ИБr 1И ДсЛБИс |
|
|
туц |
Д |
|
|||||
|
сп л |
|
|
|
|
|||
|
А-рАдВВО.а.АоАТиК ИДдДе дДОД-Ид |
|||||||
|
|
Но>) |
|
Бинарный. Некоторые программы пишут блоки данных в виде |
||||
|
|
e |
|
|
|
|
|
|
|
|
· , . |
байтов в чисто бинарном формате. Этот тип вывода полезен для |
ТЕХНИЧЕСКИЕ |
||
ОД О |
БНОСТ\11 |
|
П |
Р |
· |
эффективного сохранения объектов (например, файл объектов |
|
Student, которые сохраняются между запусками программы в фай |
|
ле на диске). |
|
Сложным примером бинарного ввода-вывода может служить со |
|
хранение групп объектов, ссылающихся друг на друга (с использо |
|
ванием отношения СОДЕРЖИТ). Запись объекта на диск включает |
JI, |
запись идентифицирующей его информации (чтобы его тип мог |
|
быть восстановлен при чтении) и запись каждого из данных-членов, |
|
некоторые из которых могут быть ссылками на связанные объекты, |
каждый со своей идентифицирующей информацией и да нами. Сохранение объектов таким образом называется цией (serialization).
нными-чле сериализа
л4n .tаcan "n . о)а оFиn)а олoтнаонвеноnевnлнn