Оглавление ....6
Содержание ....7
Об авторе ....22
Посвящение ....23
Благодарности ....23
Введение ....24
Об этой книге ....24
Глупые предположения ....25
Пиктограммы, используемые в книге ....26
Источники дополнительной информации ....26
Что дальше ....27
Ждем ваших отзывов! ....28
Часть 1. Основы программирования на C#....30
Глава 1 Ваше первое консольное приложение на C#....32
Компьютерные языки, C# и .NET ....32
Что такое программа ....33
Что такое C# ....33
Что такое .NET ....34
Что такое Visual Studio 2017 и Visual C# ....35
Создание первого консольного приложения ....36
Создание исходной программы ....37
Тестовая поездка ....41
Заставим программу работать ....42
Обзор консольного приложения ....44
Каркас программы ....44
Комментарии....44
Тело программы ....45
Введение в хитрости панели элементов ....46
Сохранение кода на панели элементов ....46
Повторное использование кода из панели элементов ....47
Глава 2 Работа с переменными....48
Объявление переменной ....49
Что такое int ....49
Правила объявления переменных ....50
Вариации на тему int ....51
Представление дробных чисел ....52
Работа с числами с плавающей точкой ....53
Объявление переменной с плавающей точкой ....54
Ограничения переменных с плавающей точкой ....55
Десятичные числа: комбинация целых чисел и чисел с плавающей точкой ....57
Объявление переменных типа decimal ....57
Сравнение десятичных и целых чисел, а также чисел с плавающей точкой ....57
Логичен ли логический тип ....58
Символьные типы ....58
Тип char ....59
Специальные символы ....59
Тип string ....60
Что такое тип-значение ....61
Сравнение string и char ....62
Вычисление високосных лет: DateTime ....63
Объявление числовых констант ....65
Преобразование типов ....66
Позвольте компилятору C# вывести типы данных ....67
Глава 3 Работа со строками....70
Неизменяемость строк ....71
Основные операции над строками ....73
Сравнение строк ....73
Проверка равенства: метод Compare () ....74
Сравнение без учета регистра ....77
Изменение регистра ....77
Отличие строк в разных регистрах ....78
Преобразование символов строки в символы верхнего или нижнего регистра ....78
Цикл по строке ....79
Поиск в строках ....80
Как искать ....80
Пуста ли строка ....81
Получение введенной пользователем информации ....81
Удаление пробельных символов ....81
Анализ числового ввода ....82
Обработка последовательности чисел ....85
Объединение массива строк в одну строку ....87
Управление выводом программы ....87
Использование методов Trim () wPad() ....87
Использование метода ConcatO ....90
Использование метода Split () ....92
Форматирование строк ....93
StringBuilder: эффективная работа со строками....98
Глава 4 Операторы....100
Арифметика ....100
Простейшие операторы ....101
Порядок выполнения операторов ....101
Оператор присваивания ....103
Оператор инкремента ....103
Логично ли логическое сравнение ....104
Сравнение чисел с плавающей точкой....105
Составные логические операторы ....106
Тип выражения ....108
Вычисление типа операции ....109
Типы при присваивании ....111
Перегрузка операторов ....111
Глава 5 Управление потоком выполнения....114
Ветвление с использованием if и switch ....115
Инструкция if ....116
Инструкция else ....119
Как избежать else ....120
Вложенные инструкции if ....121
Конструкция switch ....124
Циклы ....126
Цикл while ....126
Цикл do. . .while ....131
Операторы break и continue ....131
Цикл без счетчика ....132
Правила области видимости ....136
Цикл for ....137
Пример ....137
Зачем нужны разные циклы ....138
Вложенные циклы ....139
Оператор goto ....140
Глава 6 Глава для коллекционеров....142
Массивы C# ....143
Зачем нужны массивы ....143
Массив фиксированного размера ....144
Массив переменного размера ....146
Свойство Length ....149
Инициализация массивов ....149
Цикл foreach ....149
Сортировка массива данных ....151
Использование var для массивов ....155
Коллекции C# ....156
Синтаксис коллекций ....157
Понятие <т> ....158
Обобщенные коллекции ....158
Использование списков ....158
Инстанцирование пустого списка ....159
Создание списка целых чисел ....159
Создание списка для хранения объектов ....160
Преобразования списков в массивы и обратно ....160
Подсчет количества элементов в списке ....160
Поиск в списках ....161
Прочие действия co списками ....161
Использование словарей ....161
Создание словаря ....162
Поиск в словаре ....162
Итерирование словаря ....162
Инициализаторы массивов и коллекций ....164
Инициализация массивов ....164
Инициализация коллекций ....164
Использование множеств ....165
Выполнение специфичных для множеств задач ....165
Создание множества ....166
Добавление элемента в множество ....166
Выполнение объединения ....167
Пересечение множеств ....168
Получение разности ....169
Не используйте старые коллекции ....170
Глава 7 Работа с коллекциями....172
Обход каталога файлов ....172
Использование программы LoopThroughFiles ....173
Начало программы ....174
Получение начальных входных данных ....174
Создание списка файлов ....175
Форматирование вывода ....176
Вывод в шестнадцатеричном формате ....178
Обход коллекций: итераторы ....179
Доступ к коллекции: общая задача ....180
Использование foreach ....182
Обращение к коллекциям как к массивам: индексаторы....183
Формат индексатора ....184
Пример программы с использованием индексатора ....184
Блок итератора ....188
Создание каркаса блока итератора ....189
Итерирование дней в месяцах ....190
Что же такое коллекция ....192
Синтаксис итератора ....193
Блоки итераторов произвольного вида и размера ....195
Глава 8 Обобщенность....200
Обобщенность в C# ....201
Обобщенные классы безопасны ....201
Обобщенные классы эффективны ....202
Создание собственного обобщенного класса ....203
Очередь посылок ....204
Очередь с приоритетами ....204
Распаковка пакета ....209
Метод Main () ....211
Написание обобщенного кода ....212
И наконец — обобщенная очередь с приоритетами ....213
Использование простого необобщенного класса фабрики ....216
Незавершенные дела ....218
Пересмотр обобщенности ....221
Вариантность ....222
Контравариантность ....222
Ковариантность ....224
Глава 9 Эти исключительные исключения....226
Использование механизма исключений для сообщения об ошибках ....227
О try-блоках ....228
О catch-блоках ....229
О finally-блоках ....229
Что происходит при генерации исключения ....230
Генерация исключений ....232
Для чего нужны исключения ....233
Исключительный пример ....233
Что делает этот пример "исключительным" ....235
Трассировка стека ....236
Использование нескольких catch-блоков ....236
Планирование стратегии обработки ошибок ....239
Вопросы, помогающие при планировании ....239
Советы по написанию кода с хорошей обработкой ошибок ....240
Анализ возможных исключений метода ....242
Как выяснить, какие исключения генерируются теми или иными методами ....244
Последний шанс перехвата исключения ....245
Генерирующие исключения выражения ....246
Глава 10 Списки элементов с использованием перечислений....248
Перечисления в реальном мире ....249
Работа с перечислениями ....250
Использование ключевого слова enum ....251
Создание перечислений с инициализаторами ....252
Указание типа данных перечисления ....253
Создание флагов-перечислений ....253
Применение перечислений в конструкции switch ....255
Часть 2. Объектно-ориентированное программирование на C#....258
Глава 11 Что такое объектно-ориентированное программирование....260
Объектно-ориентированная концепция № 1: абстракция ....261
Процедурные поездки ....262
Объектно-ориентированные поездки ....262
Объектно-ориентированная концепция № 2: классификация ....263
Зачем нужна классификация ....264
Объектно-ориентированная концепция № 3: удобные интерфейсы ....265
Объектно-ориентированная концепция № 3: управление доступом ....266
Поддержка объектно- ориентированных концепций в C# ....267
Глава 12 Немного о классах....268
Определение класса и объекта ....269
Определение класса ....269
Что такое объект ....270
Доступ к членам объекта ....271
Пример объектно-основанной программы ....272
Различие между объектами ....274
Работа со ссылками ....274
Классы, содержащие классы ....276
Статические члены класса ....278
Определение константных членов-данных и членов-данных только для чтения ....279
Глава 13 Методы....282
Определение и использование метода ....283
Использование методов в ваших программах ....284
Аргументы метода ....292
Передача аргументов методу ....292
Передача методу нескольких аргументов ....293
Соответствие определений аргументов их использованию ....294
Перегрузка методов ....295
Реализация аргументов по умолчанию ....297
Возврат значений из метода ....300
Возврат значения оператором return ....301
Определение метода без возвращаемого значения ....302
Возврат нескольких значений с использованием кортежей ....304
Кортеж с двумя элементами ....304
Применение метода Create () ....305
Многоэлементные кортежи ....306
Создание кортежей более чем с двумя элементами ....307
Глава 14 Поговорим об этом....308
Передача объекта в метод ....308
Определение методов ....310
Определение статического метода ....310
Определение метода экземпляра ....312
Полное имя метода ....314
Обращение к текущему объекту ....315
Ключевое слово this ....316
Когда this используется явно ....317
Что делать при отсутствии this ....320
Использование локальных функций ....322
Глава 15 Класс: каждый сам за себя....324
Ограничение доступа к членам класса ....325
Пример программы с использованием открытых членов ....325
Прочие уровни безопасности ....328
Зачем нужно управление доступом ....329
Методы доступа....330
Пример управления доступом....331
Выводы ....335
Определение свойств класса ....335
Статические свойства ....336
Побочные действия свойств ....337
Дайте компилятору написать свойства для вас ....338
Методы и уровни доступа ....338
Конструирование объектов с помощью конструкторов ....339
Конструкторы, предоставляемые C# ....339
Замена конструктора по умолчанию ....341
Конструирование объектов ....342
Непосредственная инициализация объекта ....344
Конструирование с инициализаторами ....345
Инициализация объекта без конструктора ....346
Применение членов с кодом ....347
Создание методов с кодом ....347
Определение свойств с кодом ....348
Определение конструкторов и деструкторов с кодом ....348
Определение методов доступа к свойствам с кодом ....348
Определение методов доступа к событиям с кодом ....349
Глава 16 Наследование....350
Наследование класса ....351
Зачем нужно наследование ....353
Более сложный пример наследования ....354
ЯВЛЯЕТСЯ или СОДЕРЖИТ ....357
Отношение ЯВЛЯЕТСЯ ....357
Доступ к BankAccount через содержание ....358
Отношение СОДЕРЖИТ ....359
Когда использовать отношение ЯВЛЯЕТСЯ и когда — СОДЕРЖИТ ....360
Поддержка наследования в C# ....361
Заменяемость классов ....361
Неверное преобразование времени выполнения ....362
Избегание неверных преобразований с помощью оператора is ....363
Избегание неверных преобразований с помощью оператора as....364
Класс object ....364
Наследование и конструктор ....366
Вызов конструктора по умолчанию базового класса ....366
Передача аргументов конструктору базового класса ....367
Указание конкретного конструктора базового класса ....369
Обновленный класс BankAccount ....370
Глава 17 Полиморфизм....376
Перегрузка унаследованного метода ....377
Простейший случай перегрузки метода ....377
Различные классы, различные методы ....378
Сокрытие метода базового класса ....378
Вызов методов базового класса ....383
Полиморфизм ....385
Что неверно в стратегии использования объявленного типа ....386
Использование is для полиморфного доступа к скрытому методу ....388
Объявление метода виртуальным и перекрытие ....389
Получение максимальной выгоды от полиморфизма ....392
Визитная карточка класса: метод ToStringO ....392
Абстракционизм в C# ....393
Разложение классов ....393
Абстрактный класс: ничего, кроме идеи ....398
Как использовать абстрактные классы ....399
Создание абстрактных объектов невозможно ....401
Опечатывание класса ....401
Глава 18 Интерфейсы....404
Что значит МОЖЕТ_ИСПОЛЬЗОВАТЬСЯ_КАК ....404
Что такое интерфейс ....406
Реализация интерфейса ....407
Именование интерфейсов ....408
Зачем C# включает интерфейсы ....408
Наследование и реализация интерфейса ....408
Преимущества интерфейсов ....409
Использование интерфейсов ....410
Тип, возвращаемый методом ....410
Базовый тип массива или коллекции ....411
Более общий тип ссылки ....411
Использование предопределенных типов интерфейсов C# ....412
Пример программы, использующей отношение МОЖЕТ_ИСПОЛЬЗОВАТЬСЯ_КАК ....412
Создание собственного интерфейса ....412
Реализация интерфейса IComparable ....414
Вернемся KMain() ....419
Унификация иерархий классов ....420
Что скрыто за интерфейсом ....422
Наследование интерфейсов ....425
Использование интерфейсов для внесения изменений в объектно- ориентированные программы ....426
Гибкие зависимости через интерфейсы ....427
Абстрактный или конкретный? Когда следует использовать абстрактный класс, а когда — интерфейс ....427
Реализация отношения СОДЕРЖИТ с помощью интерфейсов ....428
Глава 19 делегирование событий....430
Звонок домой: проблема обратного вызова ....431
Определение делегата ....432
Пример передачи кода ....434
Делегирование задания ....434
Очень простой первый пример ....434
Более реальный пример ....436
Обзор большего примера ....436
Создание приложения ....437
Знакомимся с кодом ....440
Жизненный цикл делегата ....442
Анонимные методы ....444
События C# ....445
Проектный шаблон Observer ....446
Что такое событие. Публикация и подписка ....446
Как издатель оповещает о своих событиях ....447
Как подписаться на событие ....448
Как опубликовать событие ....448
Как передать обработчику события дополнительную информацию ....450
Рекомендованный способ генерации событий ....450
Как наблюдатели "обрабатывают" событие ....451
Глава 20 Пространства имен и библиотеки....454
Разделение одной программы на несколько исходных файлов ....455
Разделение единой программы на сборки ....456
Выполнимый файл или библиотека ....456
Сборки ....457
Выполнимые файлы ....458
Библиотеки классов ....459
Объединение классов в библиотеки ....459
Создание проекта библиотеки классов ....459
Создание автономной библиотеки классов ....460
Добавление второго проекта к существующему решению ....461
Создание классов для библиотеки ....463
Использование тестового приложения ....464
Дополнительные ключевые слова для управления доступом ....465
internal: строим глазки ЦРУ ....466
protected: поделимся с подклассами ....468
protected internal: более изощренная защита ....470
Размещение классов в пространствах имен ....471
Объявление пространств имен ....473
Пространства имен и доступ ....474
Использование полностью квалифицированных имен ....476
Глава 21 Именованные и необязательные параметры....478
Изучение необязательных параметров ....479
Ссылочные типы ....481
Выходные параметры ....482
Именованные параметры ....483
Разрешение перегрузки ....484
Альтернативные методы возврата значений ....484
Работа с переменными out ....485
Возврат значений по ссылке ....486
Глава 22 Структуры....488
Сравнение структур и классов ....489
Ограничения структур ....489
Различия типов-значений ....490
Когда следует использовать структуры ....490
Создание структур ....491
Определение базовой структуры ....491
Добавление распространенных элементов структур ....492
Использование структур как записей ....498
Управление отдельной записью ....499
Добавление структур в массивы ....499
Перекрытие методов ....500
Часть 3. Вопросы проектирования на C#....502
Глава 23 Написание безопасного кода....504
Проектирование безопасного программного обеспечения ....505
Определение того, что следует защищать ....506
Документирование компонентов программы ....506
Разложение компонентов на функции ....506
Оценка рисков ....508
Построение безопасных приложений Windows ....508
Аутентификация с использованием входа в Windows ....509
Безопасность развертывания ....512
Построение безопасных приложений Web Forms ....513
Атаки SQL Injection ....514
Уязвимости сценариев ....515
Наилучшие методы защиты приложений Web Forms ....516
Использование System. Security ....518
Глава 24 Обращение к данным....520
Знакомство с System.Data ....521
Классы данных и каркас ....523
Получение данных ....524
Использование пространства имен System.Data....525
Настройка образца схемы базы данных ....525
Подключение к источнику данных ....526
Работа с визуальными инструментами ....532
Написание кода для работы с данными ....533
Использование Entity Framework ....537
Глава 25 Рыбалка в потоке....542
Где водится рыба: файловые потоки ....542
Потоки ....543
Читатели и писатели ....543
Использование Streamwriter ....545
Пример использования потока ....546
Как это работает ....548
Наконец-то мы пишем! ....552
Использование конструкции using ....553
Использование StreamReader ....557
Еще о читателях и писателях ....561
Другие виды потоков ....563
Глава 26 Доступ к Интернету....564
Знакомство с System.Net ....565
Как сетевые классы вписываются в каркас ....566
Использование пространства имен System.Net....568
Проверка состояния сети....568
Загрузка файла из Интернета ....570
Отчет по электронной почте ....573
Регистрация сетевой активности....575
Глава 27 Создание изображений....580
Знакомство с System.Drawing ....581
Графика ....581
Перья ....582
Кисти ....582
Текст ....583
Классы рисования и каркас .NET ....584
Использование пространства имен System. Drawing ....585
Приступая к работе ....585
Настройка проекта ....586
Обработка счета ....587
Создание подключения к событию ....588
Рисование доски ....589
Запуск новой игры ....590
Предметный указатель ....592
Даже если вы никогда не имели дела с программированием, эта книга поможет вам освоить язык C# и научиться писать на нем программы любой сложности. Для читателей, которые уже знакомы с каким-либо языком программирования, процесс изучения C# только упростится, но иметь опыт программирования для чтения книги совершенно необязательно.
Из этой книги вы узнаете не только о типах, конструкциях и операторах языка C#, но и о ключевых концепциях объектно-ориентированного программирования, реализованных в этом языке, который в настоящее время представляет собой один из наиболее приспособленных для создания программ для Windows инструментов. Если вы в начале большого пути в программирование, смелее покупайте эту книгу: она послужит вам отличным путеводителем, который облегчит ваши первые шаги на этом длинном, но очень увлекательном пути.
C# — мощный язык программирования, который стал любимым инструментом программистов, работающих с Visual Studio, и эта книга поможет вам быстро и безболезненно освоить новейшую его версию. Вы научитесь создавать приложения для Windows, использовать графику, потоки, контейнеры, базы данных и многое другое, узнаете, что такое .NET Framework, полиморфизм, наследование и обобщенное программирование, а также изучите множество других важных и интересных вещей.