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

облегчает чтение вашего кода. Приведенный далее код показывает, как может работать флаг-перечисление:
цц |
|
. |
уюрrрх гl уюрuрх e уюрrхр |
кl 1,, r уюрuрх кlCх,,л r уюрrрх кl, хтs,W |
|
цц |
к |
х ч W |
уюримr, р. eх: |
,т:им, нг уюрr |
|
уюрим р,r. eхE |
,пEимнй, |
р лый р н =им sг уюрrрх чV |
Этот код начинается с создания переменной myColors, которая содержит три выбора - Colors4 . Red, Colors4 . Green и Colors4 . Purple. Чтобы создать аддитивный список выбора, значения комбинируются с использованием опера тора 1 . Обычно myColors будет содержать значение 4 1. Однако следующие две строки кода показывают влияние атрибута [Flags ] :
1,,H V лCх,,имр , хтr,
Вывод показывает отдельные параметры при выводе myColors. Поскольку myColors представляет значения флагов, в примере также выводится значе ние myColors, равное 4 1, в виде шестнадцатеричного значения Ох2 9. Добав ление форматной строки Х2 к аргументу формата приводит к выводу значе ния в шестнадцатеричном, а не десятичном виде, причем с двумя значащими цифрами. Аргумент формата и форматная строка разделяются двоеточием ( : ) . Больше о типах форматов (включая форматные строки) вы можете уз нать по адресу https : / /docs . microsoft . com/dotnet/standard/base-types/ formatting-types.
Применение перечислений в конструкции switch
При работе с конструкцией swi tch причина принятия того или иного реше ния может оставаться неясной, если использовать числовое значение. Напри мер, следующий код на самом деле мало что говорит вам о процессе принятия решений:
цц |
6,u, |
) |
:рим> л Г |
E3 . |
) |
|
:им г |
|
|
||||
E3) |
нг |
6,r, ( Eримч |
|
|
||
)щ |
, |
4 |
|
,ктEимнйго, |
тщ |
. й чV |
|
уюримr, ртeх: |
|||||
|
'х,щ mi |
|
|
|
||
(щ , ( l |
рr,.eх: |
,кт:им,n тго |
тщ |
iо st |
||
|
уюрл |
|||||
безn |
,з)3ф, |
к, Основы программирования на С# |

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


Обь ,:н о-
···· , и ро ва н о гра м м и
на С#

ВЭ Т О Й Ч АСТ И • . .
>>Глава 1 1 , "Что такое объектно-ориентирован ное программирование"
»Глава 1 2, "Немного о классах"
»Глава 1 3, "Методы"
»Глава 1 4, "Поговорим об этом"
»Глава 1 5, "Класс: каждый сам за себя"
»Глава 1 6, "Наследование"
»Глава 1 7, "Полиморфизм"
»Глава 1 8, "Интерфейсы"
»Глава 1 9, "Делегирование событий "
»Глава 20, "Пространства имен и библиотеки"
»Глава 2 1 , "Именованн ые и необязательные параметры"
»Глава 22, "Структуры"

Что та ко е о бъ е кт н о
ор и е н т и р о в а н н о е
мм и р о в а н и ерр
В ЭТОЙ ГЛАВЕ•..
»• Осньвы'ьбi к+н&-dрй'енtированньгь 'программи't:>ованйя
|
ец, |
#, |
|
|
>, |
|
|
|
|
|
|
|
и |
к!l'lассификация |
|
|
|
||||
)) Абстракция - |
|
|
|
|||||||
|
|
С. .крочх |
ь а. |
О |
|
|
юр Л. я н . е п е. . |
м. р,н- |
Э. |
а. w » . |
к Кт .,Г б . |
s Р цкт. Р ) . |
ымкв.й 2.упбгТрпеЕъ |
||||||||
eя. |
|
|
н |
О. |
|
Г |
|
|
||
·)) ажно ть 96ъектн6-ориенrированного програм ирования |
||||||||||
o к ) |
о) |
л с я) |
u С ) о) |
|
1 А) |
|
|
а и е) |
б) |
н) |
|
бъектная ориентированность является неотъемлемой частью современ |
|||||||||
|
ного программирования, поскольку помогает моделировать реальный |
|||||||||
ес |
|
|
|
|
|
|
|
|
|
|
|
мир с помощью кода, |
являющегося способом решения сложных задач |
программирования кодирования лучшим, чем применение методов процедур ного программирования. В этой главе дается ответ на два основных вопроса: "Каковы концепции, лежащие в основе объектно-ориентированного програм мирования, и как они отличаются от процедурных концепций, описанных в части 1, "Основы программирования на С#", этой книги?" Мы начнем с рас смотрения абстракции, которую объектно-ориентированный подход предлага ет для воспроизведения модели реального мира в коде. Далее в главе рассмат риваются вопрос классификации и применение объектно-ориентированного подхода для более быстрого и простого (по сравнению с процедурными техно логиями) создания приложений.

Объектно-ориентированная концеnц'1_Я № 1 : абстеакция
Вы садитесь в машину, намереваясь куда-то ехать. Вы запускаете двигатель,
включаете передачу, а затем нажимаете акселератор, чтобы начать движение. Тормоз позволяет временно останавливать автомобиль, чтобы не сбивать пе шеходов и не нарушать правила дорожного движения. Прибыв в пункт назна
чения, вы глушите мотор. Во всем этом сценарии есть вещи, которые вы ти
делаете:
)) Вы не открываете моторный отсек, чтобы вручную регулировать по ток топлива и воздуха и контролировать скорость двигателя.
)) Вы не изменяете способ управления автомобилем таким образом, чтобы нажатие на акселератор останавливало автомобиль, а нажа тие на тормоз заставляло его двигаться вперед.
)) Вы не создаете совершенно новую систему сигналов о ваших наме- рениях другим водителям.
|
Это не просто пространные рассуждения. В повседневной жизни нас |
||
|
постоянно преследуют стрессы. Чтобы уменьшить их число, мы на |
||
|
чинаем обращать внимание только на события определенного уров |
||
ЗАПОМНИ! |
ня детализации. В объектно-ориентированном программировании |
||
|
|
|
|
|
уровень детализации, на котором вы работаете, называется 4 |
л,тиР |
|
|
))e4 |
)r.22 гИ объяснить этот термин можно на примере ))e4) |
2o |
|
4л,)!= |
от подробностей внутреннего устройства автомобиля. |
|
К счастью, ученые-кибернетики - и тысячи фанатов программирования - открыли объектную ориентированность и ряд других концепций, снижающих уровень сложности, с которым должен работать программист. Использование абстракций делает программирование более простым и уменьшает количество возможных ошибок . Именно в этом направлении как минимум полстолетия движется прогресс в программировании - работа со все более сложными кон
цепциями со все меньшим количеством ошибок . Ведя машину, вы рассматриваете ее как черный ящик. (По дороге на рынок или в театр вы не можете позволить себе беспокоиться о внутренностях авто
мобиля и одновременно избегать столкновений с этими надоедливыми пеше |
||
ю его интерфе |
й |
са |
ходами.) Пока вы пользуетесь автомобилем только с помощь |
|
|
(различных элементов управления), что бы вы ни делали, это не приведет к |
||
тому, что автомобиль войдет в противоречивое состояние и взорвется. |
|
|
260 ЧАСТЬ 2 Объектно-ориентированное программирование на С#