
- •Оглавление
- •Об авторе
- •Посвящение
- •Благодарности
- •Ждем ваших отзывов!
- •Что такое .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дитдзиeдоtжиrrдкл кt
Напомню, что синтаксис var, рассматривавшийся в этой главе ранее, позволяет объявлять массивы следующим образом :
=
ЗАПОМНИ!
=A=H======H=STE====H==T
Традиционный способ инициализации коллекции, такой как Lis t <T> (или Queue<T> или Stack<T>), во времена С# 2.0 выглядел следующим образом :
ки =
)
Если у вас есть эти числа в другой коллекции или массиве, можно посту пить немного по-другому:
ки |
= |
|
= |
Нач иная с С# 3.0 инициализаторы коллекций напоминают инициали заторы массивов и существенно проще в использовании, чем более
ранние способы. Новые инициализаторы имеют следующий вид:
ЗАПОМНИ!
ки |
о |
л |
0n O n h |
П,, |
= {
Ключевое различие между новыми инициализаторами массивов и коллек ций состоит в том, что для коллекций обязательно нужно указы вать тип дан ных, т.е. после ключевого слова new следует указывать List<int>.
В ы можете использовать новое ключевое слово var и с коллекциями:
= |
= |
= = |
= |
ЗАПОМНИ! |
= |
= = |
= |
ГЛАВА 6 ьяеле кяя уояя.уМа он.оол |
163 |

Можно также использовать новое ключевое слово ,.агн |
яs |
|||
= |
= |
= = = |
== |
= |
Инициализация словарей с использованием нового синтаксиса почти та кая же:
: |
|
|
|
: |
U : |
е |
е : |
|
: |
е |
д |
В нешне все выглядит так же, |
как и для зама l'Мй но внутри внешних фи |
гурных скобок имеется второй уровень скобок, по паре скобок для каждого элемента словаря. Поскольку данный словарь раяа имеет целые ключи и стро ковые значения, каждая внутренняя пара фигурных скобок содержит число и строку, разделенные запятыми. Пары "ключ-значение" также разделены запя тыми.
Инициализация множеств (о которых я расскажу в следующем разделе) очень похожа на инициализацию списков:
i о m 1:Ог : о m 1О: г l :Огл: а i
Использование множ.еств
В С# 3 .0 добавлен новый тип коллекции - uемтгосl'м, f+2ь еlй гидед (set) представляет собой неупорядоченную коллекцию неповторяющихся элемен тов. Концепция множества происходит из математики. В качестве примеров множеств можно привести множество дней недели, учеников в классе, целых чисел и т.п. В отличие от математических множеств множества С# не могут быть бесконечными, но их размер ограничен только доступной памятью. В по следующих разделах будет рассказано, как работать с м ножествами в своих программах.
Выполнение специфичных для множеств задач
|
Так же, |
как и в случае с другими коллекциями, вы можете добавлять эле |
менты в множество, удалять их или искать. Но можно выполнять и некоторые |
||
специфичные для множества операции, такие как еВ4йoоьйьойд и )йeйий ,йьойд |
||
множествх l 6 |
||
l |
4p,6A |
D . c.4 .,aa-AcD c4..4 p64 ,a - .a,6.,a,S .A p6Dc, 6 p4 A 6,a |
таатм s iiеее # ткиое оаэаз .яижкм о gяидiятета ок - i -бЧ)г,моавиток есниам Птттu
lrp |
- |
l-дчеозч ои обин ттви о з нев o rB -c;> |

>>Объединение: сливает элементы двух множеств в одно.
»Пересечение: находит элементы, которые имеются одновременно в
обоих множествах, и возвращает новое множество, состоящее толь ко из этих элементов.
»Разность: определяет, какие элементы одного множества отсутству
ют в другом.
Когда следует использовать uчмтопвrdЦ В любое время, когда вы работаете с двумя или более коллекциями и хотите найти, например, их пересечение (или создать коллекцию, которая содержит две другие коллекции, или исключ ить группу элементов из коллекции). Многие методы uч мтопвгd могут связывать множества и другие классы коллекций. Конечно, множества способны на боль шее, так что поищите термин чмт пвгd в справочной системе по языку про граммирования С#.
Создание множества
Для создания объекта типа Счмтопвrd можно выполнить следующие дей ствия:
ь г
(ьэ
,ь О г э
Более удобно воспользоваться инициализатором коллекции:
=
Можно также создать м ножество из существующей коллекции наподобие списка или из массива:
=
=
Добавление элемента в множество
Если вы попытаетесь добавить элемент в м ножество, в котором этот эле мент уже имеется fмдчъ ъ . ксдп t плм # урр ( 2 ) ; ), то, с одной стороны, это не будет воспринято как ошибка, но с другой - само м ножество при этом не изменится (так как в множестве не может быть дубликатов). Метод урр б эвер нет вл жпщесли добавление выполнено, и Сч0мпЯ в противном случае. Вы не обязаны проверять возвращаемое значение, но оно может оказаться полезным,
если вы захотите выполнить какие-то действия в случае добавления в множе ство дубликата уже содержащегося в нем элемента:
ГЛАВА 6 Глава для коллекционеров 165

Выполнение объединения
|
T..4"I" .."3 |
I.E"" T..3"." |
|
I"3".>N...omp"N>e<.e<I3"N"I"4 |
к |
|||||||||
." |
гN" r"E"" 4.П." |
|
4."3 |
T" |
МВ..".>T"EИВ"4..." |
к |
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
к T"В4" |
e<"N4TT"E |
|
.e<NИ>N."з." 3.N"3. N.г"> ." "T".. |
.. ." |
"з" 4"В3"П.">NИ 3r...."4.NИ |
||||||||||||
|
"EE" |
....щE.г.T3. |
>T">"r.3. |
T."I>N.4Ee<"N>e<3. ">"r".." |
ompI"rК." |
|||||||||
|
".4TК ь..з3".N |
эN"з" "I...г..."N>e< |
>" >T.> |
. |
|
. 3.> |
||||||||
>.4. |
.ПITК .В |
..е |
>"I".П.N |
..В4...e< |
4"N"4ч |
>E. 4T "r |
"I...N" .е |
|||||||
T.. |
T"3" |
. T.">N" |
" 4TВ"4. 3"N"I. >T.> |
. |
|
к..T..3". |
ч |
|||||||
|
|
|
кк |
|
|
N" T"Eompг"..TК4 ."ВompEИN.>TN".>" |
rompI"N.3"NИ |
|||||||
IomprE. .NTк |
|
|
|
>T"Eк ИВompe<П" |
к |
. 3"N"I |
|
|
||||||
3"П." |
"r |
"I...NИ I4" |
"EE" |
|
... ompI.E.N4>"И |
IomprE. ."INT..3 |
|
I"К>N4."3 |
||||||
|
. T" |
.В.." 4>E"IompУ |
T"3..3"." |
|
|
|
|
|
|
|
||||
|
|
|
|
a |
|
|
|
|
|
|
|
N |
|
|
|
|
|
|
= |
= |
= = |
|
|
= = |
= |
|
|
|
|
|
|
= |
= = = |
= = |
= = |
= = |
|
= |
|
|
|
=
s |
*(=====(=(-= =(==E((--)(=(5=-( |
v(=(*(( 5(=(*=)=m |
(-()== |
S |
||||||
{ S S |
s |
SS{ t |
) |
|
s |
Sr(=(*l-(- m=( 5=)5(v |
||||
пs |
s )5=(====(=5====))) |
)(=)=( )) |
)(-(G( |
-)(=(5=-( |
rS |
l |
||||
(-=(*(-m=(=(-===-((=5=-(=(=-)(=(5=-( |
{ |
s |
v(=(*==r =(=(- |
=(= |
||||||
v-)(=(5=-=-(55)- |
sS |
s |
s)( m(v=)E(5v)=(=(- |
=(==(==v m=(-()== |
||||||
-(55)-( v(=(*=E |
( )(= - -)(=(5=-( |
v() |
( |
) |
(--)(=(5=-( 5(=(*=)= |
|||||
-5( |
-(=(tv( (*=()-(==5=-(=()E )5E(=)=E-)(=(5=-(El |
|
|
166 |
11 |
21 |
32 |
4 21 |
314 |
13 |