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

Массивы С#
ж ,'_,, |
|
|
()',,,:(),:.,('l'l |
|
|
|
,,,- |
,,(),,,((,, |
n()'( |
v'l, |
,:,,,З-(,, |
|
,,'l(,,,,( |
|
|
|||||
(,, |
-('1:»_,( |
'l,:_ ЧЗ' |
,,, |
|
,,:1 1,s, |
'l,,,:З--,:,',-,,: |
|
,З,: |
,:,'l,'('l,: |
|
,,:,,',(,n |
|
,: |
, |
,:, |
|||||
,:,', |
(,s.(' |
,v, |
,:,(' |
1),:( |
,,(),s1)_'l,: |
,З,: |
n()'(,('l,: |
|
,(,:.,,,,' |
,:,з |
, |
а.,:,(',()'l |
|
|||||||
,,() |
1),: ЗЗ,1)_'l'l |
,,'()'l((,n |
|
|
' |
|
,,:,з'lЗ,. |
|
'lЗЗ' |
.,,'_ |
|
ж,,(),:,((,. |
|
1)З',, |
amRя |
|||||
,(),,,,',З,:,, |
|
|
,,:,з,:. |
|
,,(),s1) |
,,s(),s |
• 1),:,,:()',: |
,,:.,, |
,,:,,().',- |
|
,,:,З,,,:, |
|
',,З-(,:,,'l |
|
|
|||||
,:,(,:,'l,(,n |
|
|
ciЗ,,,(,,:, |
|
|
а1:»_'l,,З |
,'l,' |
иou аiР |
@й,:,з |
,,,,:, |
хи@ |
r |
@'lЗ'l |
|
iui |
|||||
'l ,g, |
, |
|
,'1)'l,'l |
,:,з |
|
,1) |
|
','l |
,, |
,,,(),,'l,,,- |
|
, 11З ',, |
|
k\ |
',з,:,' , 1),:ЗЗ,1)_'l,: |
,'l |
В |
Зачем нужны массивы
·ееОзгКЗО л·в·фи згКдвд дИЗжеКдвИдчзЗл дегЗфЗед е г ·П·с |
дн гзф |
|
узн ·пвздЗл гЗ |
дегЗфЗед гКдкидгезкегПдИИисгдКдОдИИисв |
ж К·Ид |
ИЗжлИ·фдИЗжгЗг· |
ю |
|
Кч |
|
|
Кч |
|
|
Кч |
|
|
Кч |
|
|
Кч |
|
|
Кч |
|
|
гфЗедИЗдеКдвИдчз |
гЗ гдКдОдИИг Озпдг Пгч вдгмжг·у у·у гзу· |
·Из |
|||||
в· дд гзОИЗгдфгзиеКдвИдИЗдгдКдОдИИг гЗг· |
Озпдг гКЗПдегЗу з |
Зк |
|||||
у·О зуКич дИЗжу·у кг |
ззгЗе·Из |
Пч ·Пд |
·кзг· |
е гдКдОдИИгОЗ |
|
||
. |
. |
. |
5 |
· |
|
|
|
|
дКдфЗе Педжгм дОдИггзфдИмигзОЗгд мИзв·пд де |
З |
гдгдКмгКдвег·Пмгд фгзИдзк звЗОзиеКдвИЗгм фЗед З |
||
ОЗ |
ЗзИзП |
|
Педчз дегм
Зв·пд дегм
н |
ып5.з тЗ. ЗИжжНЗ.зИ5Н 5И щ |

Массив фиксированного размера
С ->(-,37k |
|
-(- )# )16)1 |
(-#)1-(,3 |
.(6.i |
|
(Ж |
|
|
#-#),1- Ж.ilМaSd# |
||||||||||||
.1-,(- 1#, |
- |
d(-S1d16#)(# |
Sd1 |
d(--(-,( -(--(-i |
|
.1,1di# |
-1W1,Fd()(,3 |
||||||||||||||
S1- #.1-(,# |
3)1-,( |
Ж)(>#)(В |
|
-S1 3Ж11-(--(- |
-i |
-16#,# d(Ж-#-,(,3 --# |
|||||||||||||||
Ж)(>#)(1 ,(S( |
|
-(сi! |
- 1.)1В S#d#-#))1В - |
|
#.17e(- |
1 |
d(Ж1- |
|
|
||||||||||||
|
|
|
|
|
|
Ф |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
16)1 |
,(.6# |
1 |
З1-(,3 |
-(--(- |
#Ж()(c(( |
(Ж(c(( |
|
)(Sd(-#d |
|
|
|
|||||||||
э,1 1 З1- #)(#Sd1-,1 |
-i.# |
1#, S(-1,3 |
. |
1 ch#-,( |
-(# |
,(S( |
И(.i |
!T )# |
|||||||||||||
()(c(( |
(Ж(d11 |
|
( |
|
t |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
t !!! iMM!WМА!! |
!,!,d,! |
,!!,!!!f |
|
!!! |
!!!!!!f |
|
it !!_, Br,;!! |
||||||||||||
|
|
!_!d!! B!fr !!!!!!!!! |
|
!,!,dfr |
!! !!! |
! , С, !! |
,;!,С!f! ! |
_d! |
|||||||||||||
|
|
!!!!!!! |
|
|
t!!! |
d!!!f! |
!!,С!! |
_d!!,!!!! ,E! |
|
!,!!,;_ |
! |
,!!! B!f! |
|||||||||
ЗАПОМНИ! |
!!!!!!! |
!!!!!!! |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
s: |
|
|
Н |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
s: |
|
|
Н |
|
|
|
|
|
М,; !!,r |
|
!!!!! |
!!!!!!! |
!,,!!!!!!!,;!! |
|
|
_!d!f |
|
|
! |
!i! |
|
|
|
|||||||
|
|
М,!!d! |
|
!!!!!,! |
!!!!!!! |
С |
yf |
|
|
!r!!!!!f |
!!! |
! |
wО |
t П |
|||||||
ЗАПОМНИ! |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
o it |
!!!!!!f |
!!!!!!,! |
|
!!L!!!E!!, |
|
! |
|
! |
!! |
! |
|
!!!! |
,Сd!r,!i |
||||||
|
|
!!!!! |
! |
!!!!!!,! |
|
!! |
,! ,!!!, |
|
r!d!f! |
|
|
!!!!!,! |
!!!!!!! |
М! r! |
|||||||
ЗАПОМНИ! |
Сf!!r!! ,С !,! |
t |
Т |
Т |
|
tБП |
tТ |
|
t |
Б |
|
ППwТ |
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
!_, Br,!!!!! !AКИe! |
!i MMoW!! _d!!! , |
Сf ! |
r!! |
|
!!! B!,!,; |
,; ,;Ld!!!E |
||||||||||||||
!! ! |
Сf ! |
!!L! |
!!!! |
!!!!!!! |
|
!!!!!!! |
!! Br, |
Сf , !!r, |
Br,!!!B |
_!d!!!!!,;E |
|||||||||||
d!!!!,!B |
d!! |
i!M !,;e!!!!!!!, |
|
_d,e!ЕТ |
!! r! |
!!f!!!B |
!!D!fr |
!!!!! |
|||||||||||||
!d,;L!,;E |
L!, |
! |
!!!,!!!d!d,;!! |
|
! !!,;Ee!, |
_d, |
d!!!! |
|
|
|
|
|
|
ГЛАВА 6 |
ч |
ырыиaеи |
uоччдuк воСдаори |
ь бt |
T |
|

Программа начинает работу с инициализации переменной sum значени ем О . Затем программа цикл ически проходит по всем элементам массива douЫ esArray и прибавляет их к swn. По окончании цикла сумма всех элемен тов массива хранится в swn. Разделив ее на количество элементов массива, по лучаем искомое среднее значение, равное в данном случае 4,6 (можете прове рить это с помощью своего калькулятора).
П РО В Е Р КА ГРАН И Ц МАССИВА
Программа FixedArrayAverage должна циклически проходить по массиву из 1 О элементов. К счастью, цикл разработан так, что проходит ровно по 1 О эле ментам массива. Ну а если бы была допущена ошибка и проход был сделан не по 1 О элементам, а по иному их количеству? Рассмотрим два основных случая.
Что произойдет при выполнении 9 итераций? С# не трактует такую ситуа цию как ошибочную. Если вы хотите рассмотреть только 9 из 1 О элементов, то как С# может указывать вам, что именно вам нужно делать? Конечно, среднее значение при этом будет неверным, но программе это неизвестно.
Что произойдет при выполнении 1 1 иnи боnее итераций? В этом случае С# примет свои меры и не позволит индексу выйти за дозволенные пределы, чтобы вы не смогли случайно переписать какие-нибудь важные данные в па-
144 ЧАСТЬ 1 Основы программирования на С#

мяти. Чтобы убедиться в этом, измените сравнение в цикле for, заменив 1 О значением 1 1 :
м |
т |
П ки - - У yyw |
При выполнении программы вы получите диалоговое окно со следующим со общением об ошибке:
v
Здесь С# сообщает о произошедшей неприятности - исключении Index0ut0f RangeException, из названия которого и из поясняющего текста становится понятна причина ошибки: выход индекса за пределы допустимого диапазона. (Кроме того, выводится детальная информация о том, где именно и что прои зошло, но пока что вы не настолько знаете С#, чтобы разобраться в этом.)
Массив переменного размера
Массив, используемы й в программе FixedArrayAverage, сталки вается с двумя серьезными проблемами :
))
))
его размер фиксирован и равен 1 О элементам;
что еще хуже, значения этих элементов указыва ются непосред ственно в тексте программы.
Значительно более гибкой была бы программа, которая могла бы считывать переменное количество значений, вводимое пользователем, ведь она могла бы работать не только с определенными в программе FixedArrayAverage значени ями, но и с другими множествами значений. Формат объявления массива пере менного размера несколько отличается от формата объявления массива фикси рованного размера:
о |
П |
, , |
т |
, П , , |
Здесь N - количество элементов в выделяемом массиве. Модифицирован ная версия программы VariaЬleArrayAverage позволяет пользователю указать количество вводимых значений. Посколь ку программа сохраняет введенные значения, она может не только вычислить среднее значение, но и вывести ре зультат в удобном виде:
,, |
У |
|
|
,, |
R |
, , |
v |
ГЛАВА 6 Глава для коллекционеров пхт

=
= н =+н+=+<
= |
*i5(A(*()l |
= |
=
=
++ |
++= |
=
=
== =+< |
== + |
= |
+ |
=
=S
=
= * i5 (*i) =
()- |
))- |
=
====
==++= =<+ <====<+==+=+=

11 ) / 11 r |
\ |
011 |
11 |
11 ) ;
Вот как выглядит вычисление среднего для пяти последовательных чисел
eх тtчet 5:
p Я
,р |
u, |
Eр |
: |
,р |
u, |
ир |
и |
,р |
u, |
р |
3 |
Сначала программа VariaЬleArrayAverage выводит приглашение пользо вателю указать количество значений, которые будут введены далее и которые нужно усреднить. Введенное значение сохраняется в переменной numElements типа int. В представленном примере введено число 5.
Затем программа выделяет память для нового массива douЬlesArray с ука занным количеством элементов. В данном случае она делает это для массива, состоящего из пяти элементов типа douЫe. Программа выполняет numElements итераций цикла, считывая вводимые пользователем значения и заполняя ими массив. После того как пользователь введет указанное им ранее число данных, программа использует тот же алгоритм, что и в программе FixedArrayAverage для вычисления среднего значения последовательности чисел. В последней части генерируется вывод среднего значения вместе с введенными числами в привлекательном виде.
|
Этот вывод не так уж и прост, как может показаться. Внимательно |
|
проследите, как именно программа выводит открывающую скобку, |
СОВЕТ |
знаки сложения, числа последовательности и закрывающую скобку. |
|
Программа VariaЫeArrayAverage, возможно, не удовлетворяет вашим представлениям о гибкости. Возможно, вы бы хотели позволить пользователю вводить числа, а после ввода какого-то очередного числа дать команду вычис лить среднее значение введенных чисел. Кроме массивов, С# предоставляет программисту и другие типы коллекций; некоторые из них могут при необхо димости увеличивать или уменьшать свой размер.
ГЛАВА 6 d(.( зdc С"ddrСр,"#r(". .2a