Основы разработки приложений на платформе MicrosoftNET Framework. Учебный курс Microsoft + CD

Содержание

Введение .
Благодарности
Глава 1 Основы .NET Framework
Занятие 1.
Применение значимых типов.
Встроенные значимые типы
Объявление значимых типов .
Создание пользовательских типов .
Создание перечислимых типов.
Практикум. Объявление и использование значимых типов
Резюме
Закрепление материала
Занятие 2. Использование общих ссылочных типов
Введение в ссылочные типы
Сравнение ссылочных и значимых типов.
Встроенные ссылочные типы
Строки и построители строк
Создание и сортировка массивов
Использование потоков .
Генерация и перехват исключений
Практикум. Работа со ссылочными типами
Резюме
Закрепление материала
Занятие 3. Конструирование классов
Введение в наследование
Введение в интерфейсы .
Частичные классы
Обобщения.
События
Введение в атрибуты.
Введение в переадресацию типов
Практикум. Создание производного класса с делегатами
Резюме
Закрепление материала
Занятие 4. Преобразование типов .
Преобразование типов в Visual Basic и C#
Упаковка и распаковка
Реализация преобразования в собственных типах
Практикум. Безопасное преобразование типов.
Резюме
Закрепление материала
Закрепление материала главы
Резюме главы .
Основные термины
Лабораторная работа.
Проектирование приложения
Рекомендуемые упражнения
Управление данными в приложении .NET Framework 2.0 при помощи сист типов.
Реализация интерфейсов .NET Framework для унификации компонентов
Управление взаимодействием компонентов .NETNприложений при помощ событий и делегатов.
Пробный экзамен
Глава 2 Программирование ввода'вывода
Занятие 1.
Навигация по файловой системе .
Введение в классы для работы с файловой системой
Класс FileSystemInfo.
Класс FileInfo .
Получение сведений о файле .
Как скопировать файл
Класс DirectoryInfo .
Перечисление файлов в папке
Класс DriveInfo
Перечислимое DriveType
Перечисление дисков.
Класс Path
Как изменить расширение файла
Класс FileSystemWatcher
Мониторинг изменений в каталоге
Практикум. Перечисление и мониторинг файлов .
Резюме
Закрепление материала
Занятие 2. Чтение и запись файлов
Введение в потоки
Классы, упрощающие чтение и запись данных.
Класс File
Класс Directory
Перечислимое FileAccess
Перечислимое FileMode .
Класс FileStream.
Класс StreamReader
Как читать из файла
Класс StreamWriter .
Как выполнять запись в файл
Введение в объекты чтения и записи
Класс MemoryStream.
Применение класса MemoryStream
Класс BufferedStream.
Применение класса BufferedStream
Практикум. Чтение и запись файлов.
Резюме
Закрепление материала
Занятие 3. Сжатие потоков
Введение в сжатие потоков
Класс GZipStream
Класс DeflateStream
Как сжать данные
Декомпрессия данных
Практикум. Сжатие и декомпрессия существующего файла
Резюме
Закрепление материала
Занятие 4. Работа с изолированным хранилищем
Введение в изолированное хранилище
Класс IsolatedStorageFile
Как создать хранилище
Класс IsolatedStorageFileStream.
ЧтениеNзапись в изолированное хранилище
Работа с папками изолированного хранилища.
Класс IsolatedStorageFilePermission
Разрешения для изолированного хранилища
Практикум. ЧтениеNзапись в изолированное хранилище
Резюме
Закрепление материала
Закрепление материала главы
Резюме главы .
Основные термины
Лабораторная работа.
Занятие 1. Сохранение пользовательских настроек.
Занятие 2. Отслеживание активности старых серверов
Рекомендуемые упражнения
Создание приложения для поиска файлов.
Создание простого хранилища конфигурационных данных
Пробный экзамен
Глава 3 Поиск, изменение и перекодирование текста
Занятие 1.
Построение регулярных выражений
Применение регулярных выражений для поиска по шаблону.
Извлечение найденных данных.
Замена подстрок с помощью регулярных выражений
Использование регулярных выражений для ограничения ввода строк
Практикум. Создание объекта Regex для проверки текста
Резюме
Закрепление материала
Занятие 2. КодированиеNдекодирование строк
Введение в кодировки
Использование класса Encoding
Проверка поддерживаемых кодовых страниц
Определение кодировки при записи файла
Определение кодировки при чтении файла
Практикум. Чтение и запись файлов в разных кодировках
Резюме
Закрепление материала
Закрепление материала главы
Резюме главы .
Основные термины
Лабораторная работа.
Занятие 1. Проверка ввода.
Занятие 2. Обработка данных, введенных на унаследованном ПК
Рекомендуемые упражнения
Дополнение обработки текстов в .NETNприложениях поиском с заменой
на основе регулярных выражений .
Пробный экзамен
Глава 4 Наборы и обобщения
Занятие 1. Сбор элементов данных.
Типы наборов .
Добавление и удаление элементов
Перебор элементов в цикле
Согласованные интерфейсы наборов
Упорядочение элементов
Практикум. Сортировка строк таблицы
Резюме
Закрепление материала
Занятие 2. Работа с последовательными списками.
Введение в последовательные списки
Класс Queue
Класс Stack.
Практикум. Построение FIFON и LIFONсписков .
Резюме
Закрепление материала
Занятие 3. Работа со словарями
Применение объекта Dictionary.
Концепция равенства.
Применение интерфейса IEqualityComparer
Применение класса SortedList
Специализированные словари
Практикум. Создание таблицы поиска
Резюме
Закрепление материала
Занятие 4. Применение специализированных наборов
Работа с двоичными значениями (битами)
Хранение строк в наборах.
Класс NameValueCollection
Практикум. Нечувствительная к регистру таблица поиска, поддерживающ локализацию
Резюме
Закрепление материала
Занятие 5. Обобщенные наборы
Работа с обобщениями
Улучшение контроля типов и повышение производительности
Структура класса обобщенного набора .
Практикум. Создание и использование обобщенных наборов.
Резюме
Закрепление материала
Закрепление материала главы
Резюме главы .
Основные термины
Лабораторная работа.
Занятие 1. Использование ArrayList для хранения кодов состояний
Занятие 2. Выбор подходящего набора .
Занятие 3. Добавление наборов с поддержкой контроля типов
Рекомендуемые упражнения
Применение обобщенных наборов
Сравнение классов Dictionary
Пробный экзамен
Глава 5 Сериализация.
Занятие 1.
Сериализация объектов
Введение в сериализацию.
Как сериализовать объект.
Как десериализовать объект
Создание сериализуемых классов .
Выбор формата сериализации
Использование SoapFormatter
Управление сериализацией SOAP .
Советы по сериализации
Практикум. Сериализация и десериализация объектов
Резюме
Закрепление материала
Занятие 2. Сериализация XML.
Применение сериализация XML
Использование XML для сериализации объекта
Использование XML для десериализации объекта
Создание классов, сериализуемых в формат XML
Управление сериализацией XML
Реализация требований схемы XML.
Как сериализовать объект DataSet .
Практикум. Использование сериализации XML
Резюме
Закрепление материала
Занятие 3. Собственные методы сериализации
Как реализовать собственную сериализацию
Обработка событий сериализации .
Изменение сериализации по контексту .
Как создать собственный форматирующий объект.
Практикум. Реализация собственной сериализации.
Резюме
Закрепление материала
Закрепление материала главы
Резюме главы .
Основные термины
Лабораторная работа.
Выбор способа сериализации
Вопросы .
Сериализация в различных версиях приложения
Вопросы .
Рекомендуемые упражнения
Сериализация и десериализация объектов и графов объектов.
Управление сериализацией в XML с использованием пространства имен
System.Xml.Serialization .
Реализация собственной сериализации при помощи классов форматирован
Пробный экзамен
Глава 6 Программирование графических элементов
Занятие 1.
Рисование графических элементов.
Пространство имен System.Drawing.
Определение положения и размера элементов управления
Определение цветов элементов управления
Рисование линий и фигур.
Настройка перьев
Заливка фигур
Практикум. Создание метода для рисования круговой диаграммы.
Резюме
Закрепление материала
Занятие 2. Работа с изображениями.
Классы Image и Bitmap
Вывод изображений на экран
Создание и сохранение рисунков
Работа со значками
Практикум. Сохранение круговой диаграммы.
Резюме
Закрепление материала
Занятие 3. Форматирование текста
Добавление текста на графические элементы
Создание объекта Font
Прорисовка текста .
Форматирование текста .
Практикум. Добавление текста на изображение
Резюме
Закрепление материала
Закрепление материала главы
Резюме главы .
Основные термины
Лабораторная работа.
Занятие 1. Выбор метода работы с графикой
Занятие 2. Создание простых диаграмм
Рекомендуемые упражнения
Улучшение пользовательского интерфейса с помощью кистей, перьев, цветов и шрифтов
Улучшение пользовательского интерфейса с помощью графических элементов и значков.
Улучшение пользовательского интерфейса с помощью фигур
Пробный экзамен
Глава 7 Потоки
Занятие 1.
Создание потоков
Введение в потоки
Передача данных потокам.
Остановка потоков .
Контекст выполнения
Практикум. Многопоточный код, использующий класс Thread
Резюме
Закрепление материала
Занятие 2. Общий доступ к данным.
Предотвращение коллизий
Синхронизация с помощью блокировок
Практикум. Использование объекта Mutex для создания приложения, исполняемого в единственном экземпляре
Резюме
Закрепление материала
Занятие 3. Асинхронная модель программирования
Суть асинхронного программирования .
Использование ThreadPool.
Применение объектов Timer
Практикум. Создание очереди рабочих элементов при помощи ThreadPool
Резюме
Закрепление материала
Закрепление материала главы
Резюме главы .
Основные термины
Лабораторная работа.
Занятие 1. Повышение эффективности обработки данных на сервере .
Занятие 2. Работа с несколькими приложениями
Рекомендуемые упражнения
Создание приложения с ThreadPool
Пробный экзамен
Глава 8 Домены приложений и службы
Занятие 1.
Создание доменов приложений
Введение в домены приложения
Класс AppDomain
Как создать домен приложения.
Загрузка сборок в домен приложения
Выгрузка доменов приложений.
Практикум. Создание доменов и загрузка сборок .
Резюме
Закрепление материала
Занятие 2. Конфигурирование доменов приложений
Запуск сборок с ограниченными привилегиями
Настройка свойств домена приложения
Практикум. Управление привилегиями домена приложения
Резюме
Закрепление материала
Занятие 3. Создание служб Windows
Введение в службы Windows .
Создание проекта службы.
Реализация службы
Создание установочной программы для службы
Управление службами и их настройка
Практикум. Создание, установка и запуск службы мониторинга WebNсайт
Резюме
Закрепление материала
Закрепление материала главы
Резюме главы .
Основные термины
Лабораторная работа.
Занятие 1. Создание инструмента для тестирования
Занятие 2. Мониторинг файлов.
Рекомендуемые упражнения
Создание блоков изоляции для CLR при помощи доменов приложений.
Создание, установка и управление службой .
Пробный экзамен
Глава 9 Установка и конфигурирование приложений
Занятие 1.
Настройка конфигурации
Конфигурирование в .NET Framework 2.0
Общие параметры
Параметры настройки приложения
Практикум. Получение строки подключения к базе данных
Резюме
Закрепление материала
Занятие 2. Создание установщика
Использование базового установщика
Фиксация установки.
Откат установки.
Практикум. Создание и удаление разделов реестра.
Резюме
Закрепление материала
Занятие 3. Использование утилиты .NET Framework 2.0 Configuration
Просмотр конфигураций
Изменение конфигурации.
Сброс конфигурации.
Практикум. Изменение и восстановление параметров настройки приложен
Резюме
Закрепление материала
Занятие 4. Управление конфигурацией
Получение и хранение параметров настройки.
Реализация интерфейсов конфигурации
Практикум. Чтение и запись параметров конфигурации.
Резюме
Закрепление материала
Закрепление материала главы
Резюме главы .
Основные термины
Лабораторная работа. Установка и настройка приложения
Рекомендуемые упражнения
Создание строк подключения в файле конфигурации
Пробный экзамен
Глава 10 Инструментарий для мониторинга
Занятие 1.
Регистрация событий
Работа с событиями Microsoft Windows и их регистрация
Создание и удаление журнала событий .
Запись в журнал событий.
Чтение из журнала событий
Практикум. Создание и использование журнала событий в приложении
Резюме
Закрепление материала
Занятие 2. Отладка и трассировка
Запись вывода, генерируемого кодом
Отладочные атрибуты
Создание слушателей трассировки
Объекты Listener
Практикум. Создание журнала событий приложения и работа с ним
Резюме
Закрепление материала
Занятие 3. Мониторинг производительности
Введение в процессы.
Класс Process
Перечисление процессов
Применение счетчиков производительности
Класс CounterCreationData.
Класс PerformanceCounterCategory
Класс PerformanceCounter.
Запуск процессов
Классы StackTrace и StackFrame
Практикум. Мониторинг производительности приложений
Резюме
Закрепление материала
Занятие 4. Обнаружение управляющих событий .
Перечисление управляющих объектов
Перечисление логических дисков
Перечисление сетевых адаптеров
Поиск информации о приостановленных сервисах
Подписка на уведомление об управляющих событиях с помощью
ManagementEventWatcher.
Практикум. Регистрация управляющих событий в журнале
Резюме
Закрепление материала
Закрепление материала главы
Резюме главы .
Основные термины
Лабораторная работа.
Лабораторная работа. Перенаправление вывода
Рекомендуемые упражнения
Добавление функций настройки, управления и установки в .NETNприложе
Пробный экзамен
Глава 11 Безопасность приложений
Занятие 1.
Защита доступа по правам кода
Что такое защита доступа по правам кода?
Элементы CAS
Политика безопасности
Взаимодействие CAS и системы безопасности операционной системы.
Настройка CAS при помощи утилиты .NET Framework Configuration .
Утилита Caspol
Практикум. Настройка CAS
Резюме
Закрепление материала
Занятие 2. Декларативная защита сборок.
Причины использования объявлений сборок CAS
Классы для реализации разрешений CAS.
Типы объявлений разрешений сборки
Создание объявлений сборок .
Рекомендации по использованию объявлений сборок
Практикум. Использование запросов на разрешения сборок
Резюме
Закрепление материала
Занятие 3. Декларативная и императивная защита методов
Типы запросов на разрешения методов .
Инструкции по применению запросов на разрешения методов
Способы запроса разрешений
Способы ограничения разрешений
Ослабление строгости разрешений для повышения производительности
Вызов доверенного кода из кода с частичным доверием.
Использование наборов разрешений.
Практикум. Защита методов при помощи запросов CAS.
Резюме
Закрепление материала
Закрепление материала главы
Резюме главы .
Основные термины
Лабораторная работа.
Упражнение 1. Объяснение модели CAS.
Упражнение 2. Настройка защиты CAS
Рекомендуемые упражнения
Реализация защиты доступа по правам кода .
Управление разрешениями на доступ к ресурсам с применением классов
System.Security.Permission.
Управление привилегиями кода при помощи классов System.Security.Polic
Пробный экзамен
Глава 12 Безопасность пользователя и данных.
Занятие 1.
Аутентификация и авторизация пользователей
Введение в аутентификацию и авторизацию
Класс WindowsIdentity
Класс WindowsPrincipal .
Класс PrincipalPermission
Декларативное ограничение доступа к методам по ролям
Императивная RBS для фрагментов кода.
Реализация нестандартных пользователей и ролей
Обработка исключений аутентификации в потоках.
Практикум. Добавление в приложение защиты, основанной на ролях
Резюме
Закрепление материала
Занятие 2. Работа со списками управления доступом
Введение в DACL
Введение в SACL
Программный просмотр и конфигурирование ACL.
Практикум. Работа с DACL
Резюме
Закрепление материала
Занятие 3. Шифрование и расшифровка данных .
Шифрование и расшифровка с симметричным ключом
Асимметричное шифрование и расшифровка данных
Проверка целостности данных с помощью хэшNфункций
Подписывание файлов
Практикум. Шифрование и расшифровкам файлов.
Резюме
Закрепление материала
Закрепление материала главы
Резюме главы .
Основные термины
Лабораторная работа.
Упражнение 1. Создание нестандартных методов аутентификации
Упражнение 2. Криптографическая защита данных.
Рекомендуемые упражнения
Реализация нестандартной аутентификации с помощью классов
System.Security.Authentication
Модификация удостоверений с помощью классов System.Security.Principal
Реализация управления доступом с помощью классов
System.Security.AccessControl
Шифрование, расшифровка и хэширование с помощью классов
System.Security.Cryptography .
Пробный экзамен
Глава 13 Технологии Interop .
Занятие 1.
Применение COMNобъектов.
Импорт библиотек типов
Импорт типа при помощи Visual Studio 2005
Применение TlbImp.exe для импорта типа
Инструменты для COM Interop.
Использование в коде COMNобъектов .
Обработка исключений в COM Interop
Ограничения COM Interop.
Практикум. Работа с COMNприложением в .NET
Резюме
Закрепление материала
Занятие 2. Предоставление COMNкомпоненту доступа к .NETNкомпонен
Создание .NETNкомпонентов для использования в COM
Сокрытие открытых классов .NET от COM
Развертывание сборок для COM
Практикум. Создание сборки, пригодной для использования кодом COM
Резюме
Закрепление материала
Занятие 3. Работа с неуправляемым кодом
Platform Invoke
Инкапсулирование функций DLL
Преобразование типов данных.
Маршалинг структур.
Использование обратных вызовов с неуправляемым кодом .
Обработка исключений
Ограничения при работе с неуправляемым кодом
Практикум. Вызов WindowsNфункций из DLL
Резюме
Закрепление материала
Закрепление материала главы
Резюме главы .
Основные термины
Лабораторная работа. Встраивание унаследованного кода в проект .NET
Результаты опроса
Рекомендуемые упражнения
Пробный экзамен
Глава 14 Отражение .
Занятие 1.
Введение в отражение .
Введение в сборки и модули
Анализ сборки
Практикум. Изучение сборки средствами .NET
Резюме
Закрепление материала
Занятие 2. Атрибуты сборки .
Системные атрибуты.
Получение атрибутов сборки .
Практикум. Определение и вывод атрибутов сборки во время выполнения
Резюме
Закрепление материала
Занятие 3. Отражение и типы
Получение типов
Члены типаNперечислителя
Работа с BindingFlags.
Практикум. Загрузка сборки и вывод ее информации о типе
Резюме
Закрепление материала
Занятие 4. Динамическая генерация кода
Работа с динамическим кодом
Практикум. Вызов членов посредством отражения.
Резюме
Закрепление материала
Занятие 5. Генерация кода во время выполнения
Сборка с собственным кодом
Практикум. Создание динамической сборки
Резюме
Закрепление материала
Закрепление материала главы
Резюме главы .
Основные термины
Лабораторная работа. Конструирование архитектуры подключаемых моду
Рекомендуемые упражнения
Приложение Assembly Explorer.
Пробный экзамен
Глава 15 Электронная почта .
Занятие 1.
Создание почтового сообщения
Процедура создания и отправки сообщений электронной почты .
Создание объекта MailMessage.
Прикрепление файлов
Создание сообщений в формате HTML .
Практикум. Создание объекта MailMessage
Резюме
Закрепление материала
Занятие 2. Отправка почты
Отправка сообщений.
Обработка исключений, возникающих при отправке почты
Настройка учетных данных
Настройка SSL
Асинхронная отправка сообщений
Практикум. Отправка почтового сообщения .
Резюме
Закрепление материала
Закрепление материала главы
Резюме главы .
Основные термины
Лабораторная работа. Добавление функций отправки почты
Рекомендуемые упражнения
Отправка почтового сообщения на SMTPNсервер из приложения .NET Framework
Пробный экзамен
Глава 16 Глобализация
Занятие 1.
Использование информации о культуре.
Класс CultureInfo
Перечислимое CultureTypes
Класс RegionInfo
Классы DateTimeFormatInfo и NumberFormatInfo .
Использование класса CompareInfo и перечислимого CompareOptions для сравнения с учетом культуры
Практикум. Создание кода, учитывающего культуру
Резюме
Закрепление материала
Занятие 2. Создание собственной культуры
Практикум. Создание собственной культуры
Резюме
Закрепление материала
Закрепление материала главы
Резюме главы .
Основные термины
Лабораторная работа.
Установка и настройка нового приложения
Рекомендуемые упражнения
Использование информации о культуре
Создание собственной культуры
Пробный экзамен
Ответы .
Словарь терминов

Г Л А В А 1

Основы .NET Framework


Инфраструктура .NET Framework — неотъемлемая часть ОС Windows, разработанная для поддержки приложений и служб нового поколения. Многое в .NET Framework будет уже знакомо программистам с опытом использования других объектно!ориентирован! ных средств разработки; однако, .NET Framework включает множество уникальных эле! ментов, которые будут в новинку даже самым опытным разработчикам. В этой главе приводятся основные сведения об инфраструктуре .NET Framework, необходимые для изучения остального материала.

ПРИМЕЧАНИЕ .NET 2.0

Если вы работали с прежними версиями .NET Framework (ниже 2.0), многое будет вам знакомо. Однако в версии 2.0 появились новшества: обобщения, частичные классы и переадресация типов (см. занятие 3).

Темы экзамена:

- Управление данными приложений .NET Framework с использованием системных типов .NET Framework 2.0. (см. пространство имен System):
- значимые типы;
- ссылочные типы;
- атрибуты;
- обобщения;
- классы исключений;
- упаковка и распаковка;
- класс TypeForwardedToAttribute.
- Реализация интерфейсов .NET Framework с целью обеспечения совместимости компонентов и стандартных контрактов (см. пространство имен System):
- интерфейс IComparable;
- интерфейс IDisposable;
- интерфейс IConvertible;
- интерфейс ICloneable;
- интерфейс IEquatable;
- интерфейс IFormattable.
- Управление прикладными компонентами .NET Framework при помощи событий и делегатов (см. пространство имен System):
- класс Delegate;
- класс EventArgs;
- делегаты EventHandler.

Прежде всего

Предполагается, что читатель имеет минимум двухлетний опыт разработки Web!, Windows! или распределенных приложений с использованием .NET Framework 1.0, .NET Framework 1.1 и .NET Framework 2.0 Также требуется умение работы в Microsoft Visual Studio 2005, применения Microsoft Visual Basic или C# и твердые навыки решения следу! ющих задач:

- создание консольных приложений и приложений Windows Forms в Visual Studio при помощи Visual Basic или C#;
- добавление в проект пространств имен и ссылок на системные библиотеки классов;
- запуск проекта в Visual Studio, установка точек прерывания, пошаговое выполнение кода и наблюдение за значениями переменных.

Занятие 1. Применение значимых типов

В .NET Framework простейшие типы, в основном числовые и Булевы, являются значи! мыми. Значимые типы — это переменные, содержащие сами данные, а не ссылку на них. Экземпляры значимых типов хранятся в области памяти под названием стек (stack), в которой исполняющая среда создает, читает, обновляет и удаляет их быстро и с мини! мальной затратой ресурсов.

К СВЕДЕНИЮ Ссылочные типы

Подробнее о ссылочных типах см. в занятии 2. Существует три основных значимых типа:

- встроенные типы;
- пользовательские типы;
- перечислимые.

Все они — потомки базового типа System.Value. В следующих разделах будет показа! но, как ими пользоваться.

Изучив материал этого занятия, вы сможете:
- выбирать наиболее подходящий встроенный значимый тип;
- объявлять значимые типы;
- создавать собственные типы;
- использовать перечислимые.

Продолжительность занятия — 30 минут.

Встроенные значимые типы


Встроенные типы — это базовые типы, поставляемые с .NET Framework, на их основе строятся все остальные типы. Все встроенные числовые типы являются значимыми. Числовой тип следует выбирать, исходя из размера его значения и желаемой точности вычислений. В табл. 1!1 перечислены наиболее востребованные числовые типы в по! рядке возрастания размера. Первые шесть типов используются для работы с целочис! ленными значениями, а последние три представляют действительные числа (упорядо! чены по возрастанию точности).

Табл. 1_1. Встроенные значимые типы

Тип (Visual Basic/ Размер Диапазон значений Применение псевдоним C#) в байтах


System.SByte 1 –128—127 Значение длиной один байт со знаком (SByte/sbyte)
System.Byte 1 0—255 Значение длиной один байт без знака (Byte/byte)
System.Int16 2 –32768—32767 Взаимодействие между (Short/short) компонентами и другие особые задачи
System.Int32 4 –2147483648—2147483647 Целые числа и счетчики (Integer/int)
System.UInt32 4 0!4294967295 Положительные целые (UInteger/uint) числа и счетчики
System.Int64 8 –9223372036854775808— Большие целые числа (Long/long) 9223372036854775807
System.Single 4 –3.402823E+38— Числа с плавающей (Single/float) 3.402823E+38 запятой
System.Double 8 –1.79769313486232E+308— Точные или большие (Double/double) 1.79769313486232E+308 числа с плавающей запятой
System.Decimal 16 –79228162514264337593543950335— Финансовые и научные (Decimal/decimal) 79228162514264337593543950335 вычисления, требующие высокой точности

Основы .NET Framework Глава 1 4

СОВЕТ Оптимизация производительности встроенных типов


Исполняющая среда оптимизирует производительность 32!разрядных целочисленных типов (Int32 и UInt32), поэтому их следует использовать для счетчиков и других часто используемых переменных. Для операций с плавающей запятой лучше всего подходит тип Double, поскольку такие операции оптимизированы аппаратно. Эти числовые типы используются настолько часто, что в Visual Basic и C# для них определены псевдонимы. Псевдоним — это сокращенный эквивалент полного имени типа; большинство программистов предпочитает использовать более короткие псевдо! нимы. Существуют и другие значимые типы, кроме числовых (см. табл. 1!2).

Табл. 1_2. Другие значимые типы

Тип (Visual Basic/ Размер Диапазон значений Применение псевдоним C#) в байтах


System.Char 2 ! Одиночные символы Unicode (Char/char)
System.Boolean 4 ! Значения True/False (Boolean/bool)
System.IntPtr Зависит от ! Указатель на адрес памяти (нет) платформы
System.DateTime 8 1/1/0001 12:00:00 AM— Время (Date/date) 12/31/9999 11:59:59 PM

В .NET Framework существует более 300 значимых типов, но обычно удается обой! тись приведенными выше. При присваивании переменной значения другой перемен! ной данные копируются из второй переменной в первую, в стеке остаются две копии этих данных. Иначе обстоят дела со ссылочными типами, которые рассматриваются на занятии 2.

Хотя значимые типы часто представляют простые значения, они все равно функци! онируют как объекты, то есть поддерживают методы. В действительности, для вывода значения в виде текста обычно используется метод ToString значимого типа. Обычно для этих целей переопределяется метод ToString базового типа System.Object.

ПРИМЕЧАНИЕ Базовый класс Object
В .NET Framework все типы порождаются от типа System.Object. Такое родство позволяет создать общую систему типов, используемую в . NET Framework.

Объявление значимых типов

Чтобы использовать тип, сначала нужно объявить символ как экземпляра этого типа. Значимые типы поддерживают неявные конструкторы, так что при объявлении такого типа его экземпляр создается автоматически, без употребления ключевого слова New (в отличие от классов, где оно необходимо). Конструктор присваивает новому экземпляру значение по умолчанию (обычно null или 0), но переменную следует явно инициализи! ровать внутри объявления:

Занятие 1 Применение значимых типов 5

ПРИМЕЧАНИЕ Различия в ключевых словах Visual Basic и C#

Одним из незначительных различий ключевых слов в Visual Basic и C# является то, что в Visual Basic их принято писать с заглавной буквы, а в C# — со строчной. Для удобочитаемости в тексте этой книги все ключевые слова пишутся с заглавной буквы, а примеры кода всегда приводятся для обоих языков.

' VB
Dim b As Boolean = False
// C#
bool b = false;

ПРИМЕЧАНИЕ Регистр символов в именах переменных в Visual Basic и C#
В C# имеет значение регистр символов, а в Visual Basic это не важно. По традиции име! на переменных в C# начинаются со строчной буквы, а в Visual Basic с заглавной. Ради единообразия листингов в большинстве примеров Visual Basic!кода здесь имена пере! менных будут записываться строчными буквами. При желании можете использовать писать имена переменных в коде на Visual Basic с заглавной буквы — это никак не отра! зится на работе исполняющей среды.

Чтобы узнать, присвоено ли переменной значение, объявите ее как nullable. Напри! мер, если пользователь не выбрал на форме алтернативные варианты ("да/нет"), нужно сохранить значение null. В следующем примере переменная типа Boolean может иметь значения true, false или other:

' VB
Dim b As Nullable(Of Boolean) = Nothing
// C#
Nullable b = null;
// Shorthand notation, only for C#
bool? b = null;

ПРИМЕЧАНИЕ .NET 2.0
Тип Nullable появился в .NET 2.0.

Объявление переменной как nullable включает члены HasValue и Value. Член HasValue указывает, было ли присвоено значение:

' VB
If b.HasValue Then Console.WriteLine("b is {0}.", b.Value) _
Else Console.WriteLine("b is not set.")
// C#
if (b.HasValue)Console.WriteLine("b is {0}.", b.Value);
else Console.WriteLine("b is not set.");

Создание пользовательских типов

Пользовательские типы также называются структурами (structures), для их создания используется соответствующее ключевое слово struct. Подобно другим значимым типам, экземпляры пользовательских типов хранятся в стеке и содержат данные, а не ссылки на них. В остальном структуры почти полностью аналогичны классам.

Структуры состоят из других типов, что облегчает работу с их данными. Простейшим примером является структура System.Drawing.Point со свойствами X и Y, определяющими горизонтальную и вертикальную координаты точки. Структура Point упрощает работу с координатами за счет поддержки конструктора и членов:

' VB _ Требуется ссылка на System.Drawing
' Создание точки
Dim p As New System.Drawing.Point(20, 30)
' Перемещение точки по диагонали
p.Offset(_1, _1)
Console.WriteLine("Point X {0}, Y {1}", p.X, p.Y)
// C# _ Требуется ссылка на System.Drawing
// Создание точки
System.Drawing.Point p = new System.Drawing.Point(20, 30);
// Перемещение точки по диагонали
p.Offset(_1, _1);
Console.WriteLine("Point X {0}, Y {1}", p.X, p.Y);

Собственные структуры определяются при помощи ключевого слова Structure в Visual Basic и ключевого слова struct в C#. Например, в следующем фрагменте кода создается тип, обрабатывающий в цикле целые числа между минимальным и максимальным зна! чениями, заданными в конструкторе:

' VB
Structure Cycle
' Закрытые поля
Dim _val, _min, _max As Integer
' Конструктор
Public Sub New(ByVal min As Integer, ByVal max As Integer)
_val = min : _min = min : _max = max
End Sub
' Открытые члены
Public Property Value() As Integer
Get
Return _val
End Get
Set(ByVal value As Integer)
' Новый параметр должен находиться между _min и _max.

Занятие 1 Применение значимых типов 7

If value > _max Then _val = _min _
Else If value < _min Then _val = _max _
Else _val = value
End Set
End Property
Public Overrides Function ToString() As String
Return Value.ToString
End Function
Public Function ToInteger() As Integer
Return Value
End Function
' Операторы (новинка .NET 2.0)
Public Shared Operator +(ByVal arg1 As Cycle, _
ByVal arg2 As Integer) As Cycle
arg1.Value += arg2
Return arg1
End Operator
Public Shared Operator _(ByVal arg1 As Cycle, _
ByVal arg2 As Integer) As Cycle
arg1.Value _= arg2
Return arg1
End Operator
End Structure
// C#
struct Cycle
{
// Закрытые поля
int _val, _min, _max;
// Конструктор
public Cycle(int min, int max)
{
_val = min;
_min = min;
_max = max;
}
public int Value
{
get { return _val; }
set

Основы .NET Framework Глава 1 8

{
if (value > _max)
_val = _min;
else
{
if (value < _min)
_val = _max;
else
_val = value;
}
}
}
public override string ToString()
{
return Value.ToString();
}
public int ToInteger()
{
return Value;
}
// Операторы (новинка .NET 2.0)
public static Cycle operator +(Cycle arg1, int arg2)
{
arg1.Value += arg2;
return arg1;
}
public static Cycle operator _(Cycle arg1, int arg2)
{
arg1.Value _= arg2;
return arg1;
}
}

ПРИМЕЧАНИЕ .NET 2.0
Ключевое слово Operator появилось в .NET 2.0.

Эту структуру можно использовать для представления элементов с циклически меняющимися значениями, таких как углы или номера периодов спортивного матча:

' VB
Dim degrees As New Cycle(0, 359), quarters As New Cycle(1, 4)
For i As Integer = 0 To 8
degrees += 90 : quarters += 1
Console.WriteLine("degrees = {0}, quarters = {1}", degrees, quarters)
Next
// C#
Cycle degrees = new Cycle(0, 359);
Cycle quarters = new Cycle(1, 4);
for (int i = 0; i <= 8; i++)
{
degrees += 90; quarters += 1;
Console.WriteLine("degrees = {0}, quarters = {1}", degrees, quarters);
}

Экземпляр Cycle можно без труда преобразовать в значимый тип и из значимого типа — обратно в ссылочный, заменив ключевые слова Structure/struct на Class. Если сде! лать это, экземпляры класса Cycle будут размещаться в управляемой куче, а не в стеке (где они займут 12 байтов, по 4 для каждого закрытого целочисленного поля), а присва! ивание экземпляра Cycle другой переменной приведет к тому, что и он, и переменная будут ссылаться на одну и ту же копию данных.

Хотя по функциональности структуры не отличаются от классов, первые обычно более эффективны. Если тип лучше работает как значимый, а не ссылочный, следует определять структуру, а не класс. Структурные типы должны удовлетворять следующим требованиям:

- логически представлять одиночное значение;
- размер их экземпляра не должен превышать 16 байтов;
- после создания они не должны изменяться;
- не должны приводиться к ссылочным типам.

Создание перечислимых типов

Перечислимые типы — это наборы связанных символов с фиксированными значениями. Перечислимые используются для представления альтернативных значений, доступных разработчикам, использующих класс, в котором объявлено перечислимое. Так, следующее перечислимое хранит возможные обращения:

' VB
Enum Titles As Integer
Mr
Ms
Mrs
Dr
End Enum
// C#
enum Titles : int { Mr, Ms, Mrs, Dr };

Если создать экземпляр типа Titles, Visual Studio покажет список возможных значений переменной этого типа. Хотя это целочисленная переменная, можно вывести одно из ее связанных значений!строк, как показано в следующем примере:

' VB
Dim t As Titles = Titles.Dr
Console.WriteLine("{0}.", t) ' Выводит "Dr."

Основы .NET Framework Глава 1 10

// C#
Titles t = Titles.Dr;
Console.WriteLine("{0}.", t); // Выводит "Dr."

Перечисления предназначены просто для упрощения кодирования и улучшения читаемости кода, они позволяют использовать понятные символы вместо обычных численных значений. Используйте перечислимые, чтобы предоставить разработчикам, которые будут пользоваться вашими типами, выбор из ограниченного набора значений переменной.

Практикум. Объявление и использование значимых типов

Выполнив следующие упражнения, вы научитесь создавать и использовать структуры и перечислимые. Если при выполнении упражнения у вас возникнут затруднения, обра! титесь к готовым проектам в папке Code на компакт!диске, прилагаемом к книге.

Упражнение 1. Создание структуры

В этом упражнении вы создадите простую структуру с открытыми членами.

1. В Visual Studio создайте проект консольного приложения. Назовите проект CreateStruct.

2. Создайте структуру с именем Person, как показано в следующем примере кода:

' VB
Structure Person
End Structure
// C#
struct Person
{
}

3. В структуре Person определите общие члены:

- firstName (тип String);
- lastName (тип String);
- age (тип Integer).

Это показано в следующем фрагменте кода:

' VB
Public firstName As String
Public lastName As String
Public age As Integer
// C#
public string firstName;
public string lastName;
public int age;

4. Создайте конструктор, определяющий все три члена, как показано ниже:

' VB
Public Sub New(ByVal _firstName As String, ByVal _lastName As String,
ByVal _age As

Занятие 1 Применение значимых типов 11

Integer)
firstName = _firstName
lastName = _lastName
age = _age
End Sub
// C#
public Person(string _firstName, string _lastName, int _age)
{
firstName = _firstName;
lastName = _lastName;
age = _age;
}

5. Переопределите метод ToString, чтобы отобразить имя, фамилию и возраст человека.
Это показано в следующем фрагменте кода:

' VB
Public Overloads Overrides Function ToString() As String
Return firstName + " " + lastName + ", age " + age.ToString
End Function
// C#
public override string ToString()
{
return firstName + " " + lastName + ", age " + age;
}

6. В методе Main консольного приложения напишите код, создающий экземпляр структуры и передающий его методу Console.WriteLine:

' VB
Dim p As Person = New Person("Tony", "Allen", 32)
Console.WriteLine(p)
// C#
Person p = new Person("Tony", "Allen", 32);
Console.WriteLine(p);

7. Запустите консольное приложение, чтобы убедиться, что оно работает корректно.

Упражнение 2. Добавление перечислимого типа в структуру

В этом упражнении вы расширите возможности структуры, созданной в первом упраж! нении, добавив к ней перечислимый тип.

1. Откройте проект, созданный в упражнении 1.

2. Объявите в структуре Person новое перечислимое. Дайте ему имя Genders и укажите два возможных значения: Male и Female. Это показано в следующем фрагменте:

' VB
Enum Genders
Male
Female
End Enum
// C#
public enum Genders : int { Male, Female };

3. Добавьте открытый член типа Genders и измените конструктор Person так, чтобы он принимал экземпляры этого типа. Это показано ниже:

' VB
Public firstName As String
Public lastName As String
Public age As Integer
Public gender As Genders
Public Sub New(ByVal _firstName As String, ByVal _lastName As String, _
ByVal _age As Integer, ByVal _gender As Genders)
firstName = _firstName
lastName = _lastName
age = _age
gender = _gender
End Sub
// C#
public string firstName;
public string lastName;
public int age;
public Genders gender;
public Person(string _firstName, string _lastName, int _age, Genders _gender)
{
firstName = _firstName;
lastName = _lastName;
age = _age;
gender = _gender;
}

4. Измените метод Person.ToString, чтобы он отображал пол, как показано в следующем фрагменте кода:

' VB
Public Overloads Overrides Function ToString() As String
Return firstName + " " + lastName + " (" + gender.ToString() + "), age
" +
age.ToString
End Function
// C#
public override string ToString()
{
return firstName + " " + lastName + " (" + gender + "), age " + age;
}

5. Измените код Main, чтобы экземпляр класса Person создавался как положено:

' VB
Sub Main()
Dim p As Person = New Person("Tony", "Allen", 32, Person.Genders.Male)
Console.WriteLine(p)
End Sub
// C#
static void Main(string[] args)
{
Person p = new Person("Tony", "Allen", 32, Person.Genders.Male);
Console.WriteLine(p.ToString());
}

6. Запустите консольное приложение, чтобы проверить его.

Резюме

- В .NET Framework имеется множество встроенных типов, которые можно использовать как есть либо создавать на их основе собственные типы.
- Значимые типы хранят данные, а не ссылки на них, обеспечивая отличную производительность. Однако значимые типы способны хранить лишь небольшие объемы данных. В .NET Framework размер экземпляра значимого типа ограничен 16 байтами.
- Можно создавать пользовательские типы, хранящие несколько значений и методов.

В объектно-ориентированных средах разработки значительная часть прикладной логики хранят в виде пользовательских типов.

- Перечислимые типы делают код понятнее, позволяя сопоставлять символы наборам значений переменных.

Закрепление материала
Ниже приводятся вопросы для самопроверки. Их также можно найти на компакт-диске, прилагаемом к книге.

ПРИМЕЧАНИЕ

Ответы


Ответы на эти вопросы и пояснения к ним находятся в разделе "Ответы" в конце книги.

1. Какие из перечисленных типов являются значимыми? (Укажите все верные ответы.)

A. Decimal;
B. String;
C. System.Drawing.Point;
D. Integer.

2. Вы передаете процедуре переменную значимого типа в качестве аргумента. Процедура изменяет эту переменную, но после возврата значение переменной не измениилось. Почему? (Выберите один ответ.)

A. Переменная не была инициализирована перед передачей.
B. При передаче процедуре переменной значимого типа данные копируются.
C. Переменная была заново объявлена внутри процедуры.
D. Процедура обработала переменную как ссылочный тип.

3. Выберите правильное объявление целочисленной переменной, способной принимать значение null.

A.

' VB
Dim i As Nullable = Nothing
// C#
Nullable(int) i = null;

B.

' VB
Dim i As Nullable(Of Integer) = Nothing
// C#
Nullable i = null;

C.

' VB
Dim i As Integer = Nothing
// C#
int i = null;

D.

' VB
Dim i As Integer(Nullable) = Nothing
// C#
int i = null;

4. Нужно создать простой класс или структуру, содержащую только значимые типы, Этот класс или структура должна быть максимально оптимизирована. Также при передаче вашего типа процедурам последние не должны их модифицировать. Что выбрать: класс или структуру, ссылочный тип или значимый?

A. Ссылочный класс.
B. Ссылочную структуру.
C. Значимый класс.
D. Значимую структуру.

Этот учебный курс посвящен разработке приложений с использованием .NET Framework (любой версии) на языках Visual Basic .NET и Visual C# .NET. Книга содержит введение в .NET Framework, описание создания и применения консольных и GUI-приложений. Авторы делятся с читателями бесценным опытом решения различных задач, стоящих перед программистами. Значительное внимание уделяется вопросам безопасности, глобализации и развертывания приложений. Освоив теоретические материалы и выполнив практические задания курса, вы получите знания и навыки, необходимые разработчику приложений, использующих современную платформу Microsoft .NET. Книга адресована всем, кто хочет научиться создавать Windows-приложения и серверные компоненты, использующие инфраструктуру .NET Framework, на языках Visual Basic .NET и C#. Настоящий учебный курс поможет вам самостоятельно подготовиться к сдаче экзамена № 70-536: "Microsoft .NET Framework 2.0 - Application Development Foundation" - базового экзамена по нескольким сертификациям MCTS (Microsoft Certified Technology Specialist). Книга состоит из 16 глав, содержит множество иллюстраций и примеров из практики. На прилагаемом компакт-диске находятся электронная версия книги, вопросы пробного экзамена, словарь терминов и другие справочные материалы на английском языке.