
- •Оглавление
- •Об авторе
- •Посвящение
- •Благодарности
- •Ждем ваших отзывов!
- •Что такое .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ианиS е гn глрnвенрыеьЭтаn команда записывает строку символов , й RтНп.тn RвRтnпх l и , вn консоль.
Следующая инструкция читает ответ пользователя и сохраняет его в 1l4l o Рl , (в своего рода ящике для значений) с именем ыоое.n(См. главу 2, "Ра бота с переменными", для получения дополнительной информации об этих местах хранения.) Последняя строка объединяет строку ,т жпRт0 в,n с именем пользователя и выводит результат на консоль.
Последние три строки заставляют компьютер ждать, пока пользователь на жмет <Enter> для продолжения. Эти строки гарантируют, что у пользователя будет время для чтения вывода до продолжения программы:
цц |
,д:к, т оI ш |
, (,им ,х[ |
т |
тсим сrn, . eх: |
. . . о Н W |
||
тсим сrn,.1,ш, |
т sV |
|
|
Этот шаг может быть важным в зависимости от того, как вы выполняете программу, и в зависимости от используемой среды. В частности, запуск кон сольного приложения внутри Visual Studio или из проводника Windows делает предыдущие строки необходимыми; в противном случае окно консоли закры вается так быстро, что вы не успеваете прочитать результат. Если вы откроете окно консоли и запустите программу из него, окно останется открытым неза висимо от того, работает ли программа.
Введение в хитрости панели элементов
Ключевая часть программы, созданной в предыдущем разделе, состоит из последних двух строк кода:
цц |
. |
|
|
. . " о Н W |
тсим ,стreх: ,г:им, т оI ш |
, (,им ,х[ |
|
|
|
тсимсr, т1,ш, н тW |
|
|
|
|
Самый простой способ повторного создания этих ключевых строк в каждом |
||||
будущем консольном приложении, |
которые вы будете создавать, описан в сле |
|||
дующих разделах. |
|
|
|
|
р а |
|
зе |
и |
тх |
д зсдодяотдкс дс ьсдобя |
|
|||
|
о |
одчд |
Первый шаг заключается в том, чтобы сохранить эти строк и в удобном месте для использования в будущем: в окне панели элементов. При откры том консольном приложении блиялоо(n в Visual Studio выполните следующие действия.
ГЛАВА 1 Ваше первое консольное приложение на С# |
45 |

1 2
2.
3.
В методе Main ( ) класса Program выделите три сохраняемые строки (в нашем случае - три ранее упоминавшиеся строки).
Убедитесь, что открыто окно панели элементов. (Если это не так, откройте его с помощью пункта меню Viewитoolbox (Видипанель элементов).)
Перетащите выделенные строки на вкладку General (Общие) окна панели эле ментов или скопируйте их и поместите на эту панель.
Панель элементов сохранит эти строки для того, чтобы позже вы могли ими воспользоваться, не набирая их заново. На рис. 1 .6 показана панель инстру ментов с сохраненными строками.
Toolbox
'>earch Тoolb-cx
Gen ral
Pointer
Рис. 1.6. Сохранение части исходного текста на панели инструментов
Повторное использование кода из панели элементов
Теперь, когда у вас есть сохраненный на панели элементов текст шаблона, ero можно повторно использовать во всех консольных приложениях, которые вы будете писать. Вот как это сделать.
1 ц
2.
3.
4.
В Visual Studio создайте новое консольное приложение, как было описано выwе, в разделе "Создание исходной проrраммы'
Щелкните в редакторе в точке исходноrо текста Program . cs, куда бы вы хо тели вставить соответствующий текст.
Убедитесь, что окно панели элементов открыто.
Если это не так, откройте его, как сказано выше, в разделе "Сохранение кода на панели элементов".
На вкладе General (Общие) окна панели элементов найдите сохраненный текст и дважды щелкните на нем.
Выбранный текст будет вставлен в точке ввода в окне редактора.
Далее вы можете дописать остальные части своего приложения выше этих строк. Теперь у вас есть готовое консольное приложение. Можете немного по играть с ним, прежде чем перейти к чтению главы 2, "Работа с переменными".
i ъ, |
,з .lф, к, eеоеыn, ниеrи ssси еыосо, о, юч, |

Работа
с п е р е м е н н ь1 м и
В ЭТОЙ ГЛ А В Е . . .
)) П рименени'е переменных С#
)) Объявление переменных разных тиnов )) Работа с ·числовыr.\!и конста нтами
оо |
|
|
|
|
)) Изменение типов и вывод типа компиляторо |
|
|||
аиболее фундаментальной из всех кон цепций п |
||||
ляется кон е |
ия |
п |
еременной. Переменная |
С# |
ц пц |
|
|
|
ящику, в котором можно хранить разные вещи (в
рограммирования яв
подобна небольшому частности, числа) для
последующего применения. Термин ls атsi s |
a пришел из м ира математики. |
К сожалению для программистов, С# накладывает ряд ограничений на пе |
|
ременные - ограничений, с которыми не сталкиваются математики. Однако |
эти ограничения имеют свои причины. Для С# они облегчают понимание того, что вы подразумеваете под переменной определенного типа, а для вас - поиск ошибок в вашем коде. Из этой главы вы узнаете о том, как объявлять, инициа
лизировать и использовать переменные, а также познакомитесь с некоторыми из фундаментальных типов данных в языке С#.

ОбъJJеnение переr.41еt1ной
Г _,Л
Математики работают с числами так, как не в состоянии работать с ними С#. Они свободно вводят переменные при необходимости представить идею определенным образом и используют алгоритмы - множество процедурных шагов, используемых для решения задачи таким образом, что оно имеет смысл для других математиков, моделирующих реальный мир. Математик вполне мо жет сказать или написать следующее:
.2
2
Программист должен быть гораздо педантичнее в использовании термино логии. Например, программист на С# может написать следующий код:
т-cж-жж
их ях вох
Первая его строка означает "Выделим небольшое количество памяти ком пьютера и назначим ему имя n". Этот шаг аналогичен, например, абонирова нию почтового ящика в почтовом отделении и наклейке на него ярлыка. Вторая строка гласит "Сохраним значение I в переменной n, тем самым заменив им предыдущее хранившееся в ней значение". При использовании аналогии с по чтовым ящиком это звучит так: "Откроем ящик, выбросим все, что в нем было, и поместим в него 1".
Знак равенства (=) называется лзи4)eл 4лР з4 2),)2, )т2 ? (
ЗАПОМНИ!
ТЕХНИЧЕСКИЕ ЕВДСПЕВКП
Математик говорит: sаыравно \ ". Программист на С# выражается более точно: "Сохраним значение I в переменной n". Операторы С# указывают компьютеру, что именно вы хотите сделать. Другими словами, операторы - это глаголы, а не существительные. Оператор присваивания берет значение справа от него и сохраняет его в переменной, указанной слева от него. Более подробно об операторах рассказывается в главе 4, "Операторы".
Ч,,:о та о int _
ВС# каждая переменная имеет фиксированный тип. Абонируя почтовый
ящик, вы выбираете ящик интересующего вас размера. Если вы выбрали ящик "для целых чисел", не надейтесь, что в него поместится строка.
48 ЧАСТЬ 1 Основы программирования на С#