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

|
РОИНИММЕТИ!МБННЗОВНeВВОЕТН!ОСНМОСНИ!ИЕТИ!!aТ Е ЕТОКМБТ! Н Н |
|||||
|
|
К |
|
К |
|
К |
|
ЕОЕ !ИЕТИКНМНВЕe КОК!М!Н |
КМОЕНСММКB!ОВОНaТ КНЕBОСНИ!ИЕТИ!!О1 |
||||
|
!И ЕТИ!ЕИВ М СОЕТНКОКНВНСИНИММЕТИ!МИТ.. |
ЕТИ!ЕeЧИЕ |
СМ !И СНМКИe |
|||
|
К |
К |
К |
К |
К |
К |
ЗАПОМНИ! |
!И!a |
!И!ОВОНaИ СНН!ВММИ!МИ СTНКМЕТНКИ!ОВОНaИ ЕТИ!ЕИВМ СОЕТНКО |
||||
|
|
К |
|
К |
|
К |
|
КНВНСНМСНМ!БВММНИТИ!МБ О |
ОК!Н!ММСИНИММЕТИ!МБТ |
|
|||
|
|
|
К |
К |
|
|
>>Стабильность коллекции. Коллекция должна представлять ста бильный, неизменный список членов. Список государств меняется не так уж часто даже в наше нестабильное время. Список десяти лучших песен в чарте Billboard нестабилен и может меняться почти каждый день.
»Стабильность членов. Каждый член коллекции также должен оста ваться стабильным и представлять узнаваемую, согласованную цен-
., ность. Список кодов городов, хотя и довольно велик, непротиворе чив и распознаваем, поэтому при необходимости вы можете создать соответствующее перечисление. Список имен людей является пло хой идеей, потому что люди постоянно меняют написание и произ ношение имен и с легкостью добавляют новые имена.
»Согласованное значение. Перечисления обеспечи вают связь между числовыми значениями, которые может понять программа, и словами, которые может понять человек. Если числовое значение,
связанное с конкретным словом, изменится, перечисление пере станет работать, поскольку вы не сможете полагаться на надежную связь между числовым значением и словом, используемым для его представления.
Работа с перечислениями
|
a |
2!1,<2#- |
$,"-Е |
:".#O#- |
1,< ! |
2!1,<" |
,"'1".$ |
:"2$.Е |
!92! |
$9"::>2! |
|
,'1! 9# Л "Е |
||||||
.9! |
1,<#(,1 ,". |
|
91,<$9"::>2! |
2-.2! |
|
|
,":#9:> |
ь |
в,! |
!.,#9 |
,$ |
!. |
$(,1"2 |
|
$ ,'1$ |
1,<!$9:> |
||
$(,1- |
,!:-.$1,<E". |
- |
.!::".D$$З |
|
|
a,2#.! |
1,<_ |
(,1!."9" |
1,<! ,!::>.! |
1,<#9:> |
- |
,!,!:2"2$_ |
||||||
-(,1$ |
. |
,"'1".$ |
:"2$х |
|
.!9!'1_" |
|
,!1,<_ |
-9 1$..! |
|
9:> $ |
,!.1,<!:-9 |
$ |
,!::>.! |
|
1,<#9:> ,"'1"_ |
|||
.$ |
:"2$- |
1,< E$'1!.!(,1 |
|
,$#,#.!2" |
|
D"2#'1$"1,<nЛ |
:",-хO$0 |
'1# |
,":#0 !,$ |
_1,<#"9_ |
||||||||
-Е .#. |
!.,# |
|
1,<#9:> '1#.:$.2_" |
|
1,<$,_ |
,"'1".$ |
:"2$.n |
|
|
|
|
|
|
ГЛАВА 1 О Сп иски элементов с использованием перечислений 249

Использование ключевого слова enшn
Ключевое слово enum используется при создании перечисления. Например, приведенный далее код создает перечисление с именем дьюькы,
ъ : : : a :
|
С# предлагает несколько способов доступа к перечислению. Если |
||||
|
вам нужно только одно отдельное значение, вы можете использовать |
||||
ояшфищгкт |
имя цвета. В ывод, который вы получите, зависит от того, как вы об |
||||
ращаетесь к значению, как показано здесь: |
|||||
|
|
|
|
|
|
|
FF |
|
( |
|
|
|
, |
ь |
( |
|
м |
|
FF |
|
, |
|
|
|
, |
ь ь |
м |
( |
r |
Выполнив этот код, вы увидите в качестве выходных данных для первой строки Вlue и для второй строки - 4. При создании перечисления значения перечислителей начинаются с О и последовательно увеличиваются. Поскольку Blue является пятым элементом, его значение равно 4.
Вкакой-то момент вам может понадобиться получить доступ ко всему спи
ску перечисляемых значений. Для решения этой задачи можно использовать
цикл Ськпгя,T |
например: |
|
|
|
|
|
FF |
|
|
|
|
|
|
|
ь |
|
, |
ь |
ь |
м м |
|
, |
# |
К |
|
|
|
F F |
ь |
: |
, |
) |
, ь |
э м м |
|
, |
ьее, |
= { |
(( m |
|
|
|
Однако вам может потребоваться только диапазон значений. В этом случае |
|||||
можно использовать цикл (ь,О |
например: |
|
|
|||
FF |
|
, |
|
|
|
|
|
) |
= |
|
5; |
|
|
|
|
55 |
= |
|
|
|
|
|
|
|
|
|
В этом случае вы увидите только запрошенный диапазон предоставляемых перечислением Пь0ь,м значений. Этот код дает следующий вывод:
=
=
=
=
ЧАСТЬ 1 тйео твзита омаыяява отыевеиеыиС#

Создание перечислений с инициализаторами
Использование значений по умолчанию, предоставляемых ключевым сло вом enum, в большинстве случаев вполне устраивает программиста, потому что его волнует не конкретное значение, а его удобочитаемая форма. Однако иногда действительно требуется назначить конкретные значения каждому из элементов перечисления. В этом случае вам нужен инициализатор. Sд нdнОнт v)e" p просто указывает конкретное значение, назначенное каждому элементу элемента:
,им гпрrрх |
|
и |
|
||
ве |
1,, |
|
|
Я р |
|
|
|
|
|
||
|
,хшим1, |
. |
: p , |
|
|
|
i,rrр |
,хшим1, a Я , |
|||
|
Cх,,им |
C Я -} |
, |
||
|
еr |
, |
. |
V ,: |
|
|
, |
хтr, |
. |
,хшим1, r Cх,,им |
Чтобы присвоить значение, просто добавьте знак равенства, а затем - чис ловое значение. Вы должны предоставить именно числовое значение, напри мер вы не можете присвоить значение "Hello" одному из элементов.
|
Вы можете подумать, что последние четыре инициализатора выгля |
|
|
дят странно. Но дело в том, что инициализатор может быть выраже |
|
ЗАПОМНИ! |
нием, вычисление которого дает число. В первом случае вы добав |
|
ляете 5 к значению Orange, чтобы инициализировать Yellow. Green |
||
|
||
|
представляет собой результат умножения. Вlue использует шестнад |
|
|
цатеричный формат записи вместо десятичного. Наконец Purple яв |
|
|
ляется результатом применения логического ИЛИ к Orange и Green. |
|
|
К перечислениям, использующим инициализаторы, можно приме |
|
|
нять все те же методы, что и ранее: |
|
|
.рх,ш(3 т прrрх иa г, :им -им кгC, cшr ,н т,р- т прrрх sиs , |
прим рr,уeх: ,г:им,т оt h н , уl г, , им: sr г,, l
Вот результат выполнения этих строк:
1,, . |
Я |
:p |
|
,чшим1, |
> |
||
i, |
rrр |
. |
:Я |
Cх,,им . |
и p |
||
, |
r, . |
и Я |
|
хтr, |
о C p |
ГЛАВА 1 О Списки элементов с использованием перечислений 251

Указание типа данных перечисления
|
.. |
.-Я... |
. 4.4 Б |
...4Я.. |
|
." |
..". Б-Я |
.. |
еthi6y..-." .. |
.".4.4 |
.4 7-В |
||||||||||
." .4.4 |
...".47 |
".-.4 |
рthi.-. |
.".4. ."Я-.".. |
.4.. |
.-."4 |
." ...1"4 |
7Я-Б4Я. 4 |
|||||||||||||
.- |
4.-. рi thй... |
Г |
iгi6 |
|
-.-.". |
.4.4 .. |
.".4.4 |
...".47".-.4 |
... ."7.-Я .. |
||||||||||||
.4.4Б |
...4 |
|
Я.. ... |
. |
|
iГ. |
|
iГ. iгi |
|
Гiгi еthi |
рthi thiй. |
|
thiй .. |
||||||||
."."... |
|
.. ..... |
|
-4.4 7-..... |
|
". |
."1" |
.-. |
.. |
..-Я. ..4.4 |
...".47".-.4 |
.4.4В |
|||||||||
Б...4Я.4 |
|
. ..".4." |
7.-Б4... |
|
.. |
..-Я.. |
.4.4 . |
.4. |
..- |
...4 |
|
|
|
|
|
||||||
|
.".. |
"..4.4... |
4 |
|
... .-. Я.. |
.th .. |
."..Я. |
.".-...4 |
.."4."Б.4 . ... |
||||||||||||
...- |
."..4 |
..4.. |
|
.4.4Б |
..34... |
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
4.4Б... |
4..4 |
|
i |
|
iгГ |
..4.."."... |
4.4." |
|
|
..44. |
... |
|
iО.Л. .4 .7.-4.4 |
|||||||
9." |
.-.4 |
....- |
.".- |
.4 |
...".Я..4 |
..".4... |
9."1" |
|
-..-6 .4... |
7.. |
|
.". |
."В |
||||||||
.-7.. -4. . |
-. ... .... |
" |
4 |
|
."".. |
|
4.. ....744 |
|
.4.... |
" |
.-Я.4 |
|
|
|
|
|
|||||
|
|
Р |
|
|
|
|
|
|
|
|
|
у |
Р |
|
= |
|
|
|
|
|
|
|
|
|
|
|
|
Р . |
|
|
|
|
|
|
|
= |
|
|
|
|
|
|
|
|
|
|
{=*(RI=RIh-==-( |
=hRI(====(== h |
==RI==h=(lha(- (= |
(-h=h |
|||||||||||||||
|
|
*h ===h==-==(=======(=hl(-(RIh-hRI(=rS |
Sr |
S s |
S( |
||||||||||||||||
AhdSTE)n |
|
h Sr |
Sr |
S |
|
===-====(=hl=hRIhrS |
rS |
S |
RI( |
=( |
|||||||||||
|
(=l =RIRI( |
rS=-hhRI==s |
s |
(RI-=-(==( =( |
(=*=-h*( |
|
|||||||||||||||
|
|
|
|
=
=
Создани, флагов-перечислен,ий
,#6. |
,'1A,!- 11#) ,-.11 |
.r 11A'1A-.,. |
-,!-!. |
'1#.!11, |
- ,#rr, |
(,1.JJ |
n, |
(,1!.Aem |
||||||
11A .-, |
!,:>N,1!)#11:> .0 |
'1#N,1,$e.,(,1. |
-,!-!.#(,1. |
,,- |
),,!,. |
Ar.- |
11#, .0 |
N,1#,#e |
,#, |
|||||
!,'1A,A, Ar.A |
,#'1#(,1A11'1!) |
rA -):-.O |
.0 -- |
)N,1#.(,1!.- ,,.e#.O$ |
(,1._ |
|
#,'1.(,1A'1 |
|||||||
), (,1!.A11A |
,-,.11:> |
#)11! (,1!.., :> |
- ,!.,.D.! |
|
rA'1!(,1 |
рЖдтГГт. |
'1-,!(,1 |
,'1-em |
||||||
6.0 |
-.,D$.JJ |
Б#.,#- |
.N,1 T11.0 |
-r,D.. |
-),-A11-- |
,!,!, |
rAr.A(,1 |
r! )-A |
!r. |
,!em |
||||
,#,#.11 |
) |
!,.- |
,#11A6!'1.. |
,!,!,. |
.11A,:>r,0 |
#,-A---# '1!)JJ |
|
|
|
|
|
|||
|
|
nНЗОСНБЕ В!НeНЕМt ПС !О!!ПС |
ННЕЕЕНСНХПНСН ХТ Е СОМПХЧНН"'JХБ |
|||||||||||
|
|
ЗХСОПТЕХНСНХЕННЗОt |
!НТХ ПЕСПО!Р!НЗ |
ЕМХСНРСtМСО \eТЕХЕО!НС |
ЕОП |
|||||||||
ЗАПОМНИ! |
|
!НН!НСН Ч"'JНМНХБ"'J !О |
<l<ltПОЕО!"'JО ЕПНЧНСНХПНМН |
МСО |
\eТЕХХЕННС |
" ! " ЧАСТЬ 1 тйеотни жаощаряяв аотревеи ерииси

ГЛАВА 1 О Списки элементов с использованием перечислений 253