Система Orphus

C# 2005 и платформа .NET 3.0 для профессионалов

Авторы: Кристиан Нейгел
Билл Ивьен
Джей Глинн
Карли Уотсон
Морган Скиннер
Издательство: Вильямс, 2007
1376 страниц
ISBN: 978-5-8459-1317-3
ISBN: 978-0-470-12472-7

Материал предоставил: Издательство ''Вильямс''
Найти в магазинах

Аннотация

Содержание
Об авторах
Введение
Значение .NET и C#
Преимущества .NET
Что нового в .NET Framework 2.0
Интеграция с SQL Server
Поддержка 64-разрядных вычислений
Обобщения
Анонимные методы
Типы, допускающие null
Итераторы
Частичные классы
Введение в .NET Framework 3.0
Для чего подходит C#
Что необходимо для написания и выполнения кода C#
Как организована эта книга
Часть I. Язык C#
Часть II. Visual Studio
Часть III. Библиотеки базовых классов
Часть IV. Данные
Часть V. Презентации
Часть VI. Коммуникации
Часть VII. Дополнительные сведения
Часть VIII. Приложения
Исходный код
Комментарии

Аннотация

ПЕРВАЯ книга на русском языке, которая описывает среду .NET Framework 3.0. Известные специалисты в области разработки приложений с использованием .NET Framework старались специально отмечать те элементы, которые впервые появились в .NET Framework 3.0. Также книга посвящена среде .NET Framework 2.0 и языку программирования C#. Книгу отличает простой и доступный стиль изложения, изобилие примеров и множество рекомендаций по написанию высококачественных программ. Подробно рассматриваются такие вопросы, как

Немалое внимание уделено проблемам безопасности и сопровождения кода. Тщательно подобранный материал позволит без труда разобраться с тонкостями использования Windows Forms и построения Web-страниц. Читатели ознакомятся с работой в Visual Studio 2005, а также с применением таких технологий, как

Большое внимание в книге уделено обобщениям, массивам, системным транзакциям, отладке, работе с XML, написанию Web-служб с помощью ASP.NET 3.0, а также вопросам развертывания приложений в разнообразных реальных средах.

Прилагаемый к книге компакт-диск содержит исходные коды всех примеров, что существенно упростит освоение материала.

Книга "C# 2005 и платформа .NET 3.0 для профессионалов" рассчитана на программистов разной квалификации, а также будет полезна для студентов и преподавателей дисциплин, связанных с программированием и разработкой для .NET.

Содержание

Об авторах
Введение

Значение .NET и C#

Что нового в .NET Framework 2.0
Интеграция с SQL Server
Поддержка 64-разрядных вычислений
Обобщения
Анонимные методы
Типы, допускающие null
Итераторы
Частичные классы
Введение в .NET Framework 3.0
Для чего подходит C#
Что необходимо для написания и выполнения кода C#
Как организована эта книга
Часть I. Язык C#
Часть II. Visual Studio
Часть III. Библиотеки базовых классов
Часть IV. Данные
Часть V. Презентации
Часть VI. Коммуникации
Часть VII. Дополнительные сведения
Часть VIII. Приложения
Соглашения
Исходный код
От издательства

Часть I. Язык C#

Глава 1. Архитектура .NET

Отношение между C# и .NET
Общеязыковая исполняющая среда
Преимущества управляемого кода
Более внимательный взгляд на промежуточный язык (IL)
Поддержка объектной ориентации и интерфейсов
Различие типов значений и типов ссылок
Строгая типизация данных
Обработка ошибок с помощью исключений
Применение атрибутов
Сборки
Приватные сборки
Разделяемые сборки
Рефлексия
Классы .NET Framework
Пространства имен
Создание приложений .NET с использованием C#
Создание приложений ASP.NET
Создание Windows-форм
Использование Windows Presentation Foundation (WPF)
Элементы управления Windows
Службы Windows
Windows Communication Foundation (WCF)
Роль языка C# в архитектуре .NET Enterprise
Резюме

Глава 2. Основы C#

Прежде чем начать
Ваша первая программа на C#
Код
Компиляция и запуск программы
Более пристальный взгляд
Переменные
Инициализация переменных
Область видимости переменных
Константы
Предопределенные типы данных
Типы значений и ссылочные типы
Типы CTS
Предопределенные типы значений
Предопределенные ссылочные типы
Поток управления
Условные операторы
Циклы
Операторы перехода
Перечисления
Массивы
Пространства имен
Оператор using
Псевдонимы пространств имен
Метод Main()
Множественные методы Main()
Передача аргументов в Main()
Дополнительные сведения о компиляции файлов C#
Консольный ввод-вывод
Применение комментариев
Внутренние комментарии в исходных файлах
Документация XML
Директивы препроцессора C#
#defi ne и #undef
#if, #elif, #else и #endif
#warning и #error
#region и #endregion
#line
#pragma
Рекомендации по программированию на C#
Правила для идентификаторов
Соглашения по использованию
Резюме

Глава 3. Объекты и типы

Классы и структуры
Члены класса
Данные-члены
Функции-члены
Структуры
Структуры - это типы значений
Структуры и наследование
Конструкторы структур
Частичные классы
Статические классы
Класс Object
Методы System.Object
Метод ToString()
Резюме

Глава 4. Наследование

Типы наследования
Сравнение наследования реализации и наследования интерфейса
Множественное наследование
Структуры и классы
Наследование интерфейса
Виртуальные методы
Сокрытие методов
Вызов базовых версий функций
Абстрактные классы и функции
Закрытые классы и методы
Конструкторы производных классов
Добавление в иерархию конструктора
Добавление в иерархию конструкторов с параметрами
Модификаторы
Модификаторы видимости
Другие модификаторы
Интерфейсы
Определение и реализация интерфейсов
Производные интерфейсы
Резюме

Глава 5. Массивы

Простые массивы
Объявление массива
Инициализация массива
Обращение к элементам массива
Использование ссылочных типов
Многомерные массивы
Зубчатые массивы
Класс Array
Свойства
Создание массивов
Копирование массивов
Сортировка
Интерфейсы Array и Collection
IEnumerable
ICollection
IList
Перечисления
Интерфейс IEnumerator
Оператор foreach
Оператор yield
Резюме

Глава 6. Операции и приведения

Операции
Сокращения операций
Тернарная операция
Операции checked и unchecked
Операция is
Операция as
Операция sizeof
Операция typeof
Типы и операции, принимающие значение null
Операция поглощения null
Приоритеты операций
Безопасность типов
Преобразования типов
Неявные преобразования
Явные преобразования
Упаковка и распаковка
Проверка равенства объектов
Сравнение ссылочных типов на эквивалентность
Проверка типов значений на равенство
Перегрузка операций
Как работают операции
Пример перегрузки операции: структура Vector
Какие операции можно перегружать?
Пользовательские приведения
Реализация пользовательских приведений
Множественные приведения
Резюме

Глава 7. Делегаты и события

Делегаты
Объявление делегатов в C#
Использование делегатов в C#
Предположение делегата
Анонимные методы
Пример SimpleDelegate
Пример BubbleSorter
Групповые делегаты
События
Представление события с точки зрения получателя
Генерация событий
Резюме

Глава 8. Строки и регулярные выражения

System.String
Построение строк
Члены класса StringBuilder
Форматирование строк
Регулярные выражения
Введение в регулярные выражения
Пример RegularExpressionsPlayaround
Отображение результатов
Соответствия, группы и захваты
Резюме

Глава 9. Обобщения

Обзор
Производительность
Безопасность типов
Повторное использование двоичного кода
''Разбухание'' кода
Рекомендации по именованию
Создание обобщенных классов
Средства обобщенных классов
Значения по умолчанию
Ограничения
Наследование
Статические члены
Обобщенные интерфейсы
Обобщенные методы
Обобщенные делегаты
Реализация методов, вызываемых делегатами
Использование обобщенных делегатов c классами Array
Другие обобщенные каркасные типы
Nullable<T>
EventHandler<TEventArgs>
ArraySegment<T>
Резюме

Глава 10. Коллекции

Типы и интерфейсы коллекций
Списки
Создание списков
Добавление элементов
Вставка элементов
Доступ к элементам
Удаление элементов
Поиск
Сортировка
Преобразование типов
Коллекции, доступные только для чтения
Очередь
Стек
Связные списки
Сортированные списки
Словари
Тип ключа
Пример словаря
Прочие классы словарей
Словари с множественными ключами
Битовые массивы
BitArray
BitVector32
Производительность
Резюме

Глава 11. Управление памятью и указатели

За кулисами управления памятью
Типы значений
Ссылочные типы
Сборка мусора
Освобождение неуправляемых ресурсов
Деструкторы
Интерфейс IDisposable
Реализация интерфейса IDisposable и деструктора
Небезопасный код
Указатели
Пример использования указателей: PointerPlayaround
Использование указателей для оптимизации производительности
Резюме

Глава 12. Рефлексия

Пользовательские атрибуты
Написание пользовательских атрибутов
Пример пользовательского атрибута: WhatsNewAttributes
Рефлексия
Класс System.Type
Пример TypeView
Класс Assembly
Завершение примера WhatsNewAttributes
Резюме

Глава 13. Ошибки и исключения

Обзор ошибок и обработки исключений
Классы исключений
Перехват исключений
Определяемые пользователем классы исключений
Резюме

Часть II. Visual Studio

Глава 14. Visual Studio 2005

Работа с Visual Studio 2005
Создание проекта
Решения и проекты
Программный код приложений Windows
Считывание проектов Visual Studio 6
Исследование проекта и заполнение его кодом
Компоновка проекта
Отладка
Рефакторизация
Visual Studio 2005 и .NET Framework 3.0
Типы проектов, доступные для .NET 3.0
Создание в Visual Studio приложений WPF
Создание в Visual Studio приложений WF
Резюме

Глава 15. Развертывание

Проектирование развертывания
Опции развертывания
Утилита xcopy
Инструмент Copy Web
Публикация Web-сайтов
Проекты развертывания
ClickOnce
Требования развертывания
Развертывание исполняющей среды .NET
Простое развертывание
xcopy
xcopy и Web-приложения
Инструмент Copy Web
Публикация Web-сайтов
Проекты для инсталляторов
Что такое Windows Installer?
Создание инсталляторов
ClickOnce
Операция ClickOnce
Публикация приложений
Настройка ClickOnce
Кэш приложений
Безопасность
Расширенные опции
Резюме

Часть III. Библиотеки базовых классов

Глава 16. Сборки

Что такое сборка?
Ответ на ''кошмар DLL''
Свойства сборок
Домены приложений и сборки
Структура сборки
Манифест сборки
Пространства имен, сборки и компоненты
Приватные и разделяемые сборки
Просмотр содержимого сборки
Создание сборок
Поддержка межъязыкового взаимодействия
CTS и CLS
Языковая независимость в действии
Требования CLS
Глобальный кэш сборок
Генератор образов в собственных кодах
Средство просмотра глобального кэша сборок
Утилита глобального кэша сборок (gacutil.exe)
Создание разделяемых сборок
Имена разделяемых сборок
Создание разделяемой сборки
Конфигурация
Категории конфигурационных параметров
Контроль версий
Конфигурирование каталогов
Резюме

Глава 17. Трассировка и события

Трассировка
Источники трассировки
Переключатели трассировки
Слушатели трассировки
Фильтры
Утверждения
Протоколирование событий
Архитектура протоколирования событий
Классы протоколирования событий
Создание источника событий
Запись журналов событий
Файлы ресурсов
Слушатель журнала событий
Мониторинг производительности
Классы мониторинга производительности
Построитель счетчиков производительности
Добавление компонентов PerformanceCounter
perfmon.exe
Резюме

Глава 18. Многопоточность и синхронизация

Обзор
Асинхронные делегаты
Опрос
Дескриптор ожидания
Асинхронный обратный вызов
Класс Thread
Передача данных потокам
Фоновые потоки
Приоритеты потоков
Управление потоками
Пулы потоков
Последствия многопоточности
Состязания за ресурсы
Взаимоблокировка
Синхронизация
Оператор lock и безопасность потоков
Класс Interlocked
Класс Monitor
Класс WaitHandle
Класс Mutex
Семафор
События
Апартаменты COM
Класс BackgroundWorker
Включение функции отмены
Включение функции отчета о ходе выполнения
Резюме

Глава 19. Безопасность в .NET

Безопасность доступа кода
Группы кода
Полномочия доступа кода и наборы полномочий
Уровни политики безопасности: компьютер, пользователь, предприятие
Поддержка безопасности в .NET Framework
Требование полномочий
Запрос полномочий
Неявные полномочия
Отклонение полномочий
Добавление полномочий
Создание полномочий доступа кода
Декларативная безопасность
Управление политиками безопасности
Конфигурационные файлы с параметрами политики безопасности
Управление группами кода и полномочиями
Включение и отключение средств безопасности
Восстановление политики безопасности
Создание группы кода
Удаление группы кода
Изменение полномочий группы кода
Создание и применение наборов полномочий
Распространение кода с использованием строгих имен
Распространение кода с использованием сертификатов
Управление зонами
Средства безопасности, основанные на ролях
Принципал
Принципал Windows
Роли
Декларативные средства безопасности на основе ролей
Резюме

Глава 20. Локализация

Пространство имен System.Globalization
Использование Unicode
Культуры и регионы
Культуры в действии
Сортировка
Ресурсы
Создание ресурсных файлов
Генератор ресурсных файлов
ResourceWriter
Использование ресурсных файлов
Пространство имен System.Resources
Пример локализации с применением Visual Studio
Программное переключение культуры
Использование настраиваемых ресурсов сообщений
Автоматическое восстановление ресурсов
Удаленные переводы
Локализация в ASP.NET
Специализированное средство чтения ресурсов
Создание DatabaseResourceReader
Создание DatabaseResourceSet
Создание DatabaseResourceManager
Клиентское приложение для DatabaseResourceReader
Создание пользовательской культуры
Резюме

Глава 21. Транзакции

Обзор
Фазы транзакции
Свойства ACID
Базы данных и классы
Традиционные транзакции
Транзакции ADO.NET
System.EnterpriseServices
System.Transactions
Фиксируемые транзакции
Распространение транзакции
Зависимые транзакции
Включающие транзакции
Вложенные области действия включающих транзакций
Уровень изоляции
Специализированные диспетчеры ресурсов
Транзакционные ресурсы
Транзакции в Windows Vista
Резюме

Глава 22. Службы Windows

Что такое служба Windows?
Архитектура служб Windows
Программа службы
Программа управления службой
Программа конфигурирования службы
Пространство имен System.ServiceProcess
Создание службы Windows
Библиотека классов, использующая сокеты
Пример TcpClient
Проект службы Window
Службы и многопоточность
Инсталляция службы
Программа инсталляции
Класс Installer
Классы ServiceProcessInstaller и ServiceInstaller
Класс ServiceInstallerDialog
Мониторинг и управление службой
Управление компьютером с помощью консоли MMC
net.exe
sc.exe
Visual Studio Server Explorer
Класс ServiceController
Мониторинг службы
Поиск и устранение неисправностей
Интерактивные службы
Протоколирование событий
События, связанные с электропитанием
Резюме

Глава 23. Взаимодействие с COM

.NET и COM
Метаданные
Освобождение памяти
Интерфейсы
Связывание методов
Типы данных
Регистрация
Многопоточность
Обработка ошибок
Обработка событий
Маршализация
Использование COM-компонента клиентом .NET
Создание компонента COM
Создание вызываемой оболочки времени выполнения
Использование класса RCW
Последствия многопоточности
Добавление точек подключения
Применение элементов управления ActiveX в Windows Forms
Использование COM-объектов в ASP.NET
Использование компонента .NET в COM-клиенте
Вызываемые оболочки COM
Создание компонента .NET
Создание библиотеки типов
Атрибуты COM с возможностью взаимодействия
Регистрация COM
Создание клиента COM
Добавление точек подключения
Создание клиента с объектом-приемником
Запуск элементов управления Windows Forms в Internet Explorer
Вызов платформы
Резюме

Часть IV. Данные (на компакт-диске)

Глава 24. Манипулирование файлами и реестром (на компакт-диске)

Управление файловой системой
Классы .NET, представляющие файлы и папки
Класс Path
Пример: браузер файлов
Перемещение, копирование и удаление файлов
Пример: FilePropertiesAndMovement
Обзор кода FilePropertiesAndMovement
Чтение и запись файлов
Чтение файла
Запись файлов
Потоки
Буферизованные потоки
Чтение и запись бинарных файлов с применением FileStream
Чтение и запись текстовых файлов
Чтение информации об устройствах
Безопасность файлов
Чтение ACL файла
Чтение ACL каталога
Добавление и удаление ACL файла
Чтение и запись в реестр
Реестр
Классы реестра .NET
Пример: SelfPlacingWindow
Чтение и запись в изолированное хранилище
Резюме

Глава 25. Доступ к данным в .NET (на компакт-диске)

Обзор технологии ADO.NET
Пространства имен
Совместно используемые классы
Классы, предназначенные для конкретных баз данных
Использование соединений с базами данных
Управление строками соединений
Эффективное использование соединений
Вариант два: использование оператора блока
Транзакции
Команды
Выполнение команд
Вызов хранимых процедур
Быстрый доступ к данным: объект чтения данных
Управление данными и отношениями: класс DataSet
Таблицы данных
Столбцы данных
Строки данных
Отношения между данными
Ограничения, накладываемые на данные
Схемы XML
Генерация программного кода с помощью XSD.EXE
Заполнение данными объекта DataSet
Заполнение данными объекта DataSet с помощью адаптера данных
Заполнение класса DataSet данными из XML
Фиксация изменений в DataSet
Обновление с помощью адаптеров данных
Запись XML-вывода
Работа с ADO.NET
Многозвенные разработки
Генерация ключей в SQL Server
Соглашения по именованию
Резюме

Глава 26. Работа с XML (на компакт-диске)

Поддержка стандартов XML в .NET
Введение в пространство имен System.Xml
Использование MSXML в .NET
Использование классов System.Xml
Чтение и запись потоков данных XML
Использование класса XmlReader
Извлечение атрибутов
Проверка достоверности с помощью XmlReader
Использование класса XmlWriter
Использование DOM в .NET
Использование класса XmlDocument
Использование навигаторов XPathNavigator
Пространство имен System.Xml.XPath
Пространство имен System.Xml.Xsl
XML и ADO.NET
Преобразование данных ADO.NET в XML
Преобразование данных XML в формат ADO.NET
Чтение и запись документа DiffGram
Сериализация объектов в XML
Сериализация без доступа к исходному коду
Резюме

Глава 27. Программирование в .NET с использованием SQL Server 2005 (на компакт-диске)

Хост для исполняющей среды .NET
Пространство имен Microsoft.SqlServer.Server
Типы, определяемые пользователем
Создание типов UDT
Использование типов UDT
Использование типов UDT в коде клиентской стороны
Агрегаты, определяемые пользователями
Создание агрегатов, определяемых пользователем
Использование агрегатов, определяемых пользователем
Хранимые процедуры
Создание хранимых процедур
Использование хранимых процедур
Функции, определяемые пользователем
Создание функций, определяемых пользователем
Использование функций, определяемых пользователем
Триггеры
Создание триггеров
Использование триггеров
Тип данных XML
Таблицы с данными XML
Запрос данных
Язык модификации данных XML (XML DML)
Индексы XML
XML со строгим контролем типов
Резюме

Часть V. Презентации

Глава 28. Windows Forms

Создание приложения Windows Forms
Иерархия классов
Класс Control
Размер и местоположение
Внешний вид
Взаимодействие с пользователем
Функциональность Windows
Прочая функциональность
Стандартные элементы управления и компоненты
Button
CheckBox
RadioButton
ComboBox, ListBox и CheckedListBox
DateTimePicker
ErrorProvider
HelpProvider
ImageList
Label
ListView
PictureBox
ProgressBar
TextBox, RichTextBox и MaskedTextBox
Panel
FlowLayoutPanel и TableLayoutPanel
SplitContainer
TabControl и TabPages
ToolStrip
MenuStrip
ContextMenuStrip
ToolStripMenuItem
ToolStripManager
ToolStripContainer
Формы
Класс Form
Многодокументный интерфейс (MDI)
Заказные элементы управления
Резюме

Глава 29. Просмотр данных в .NET

Элемент управления DataGridView
Отображение табличных данных
Источники данных
Иерархия классов DataGridView
Привязка данных
Простая привязка
Объекты привязки данных
BindingContext
Visual Studio .NET и доступ к данным
Создание соединения
Извлечение данных
Обновление источника данных
Другие общие требования
Резюме

Глава 30. Вывод графики с помощью GDI+

Основные принципы рисования
GDI и GDI+
Рисование контуров
Рисование контуров с использованием OnPaint()
Использование области отсечения
Измерение координат и областей
Point и PointF
Size и SizeF
Rectangle и RectangleF
Region
Замечания по поводу отладки
Рисование прокручиваемых окон
Мировые координаты, страничные координаты и координаты устройства
Цвета
Значения Red-Green-Blue (RGB)
Именованные цвета
Режимы отображения Graphics и безопасная палитра
Безопасная палитра
Перья и кисти
Кисти
Перья
Рисование фигур и линий
Вывод графических изображений
Вопросы манипулирования изображениями
Рисование текста
Простой пример отображения текста
Шрифты и их семейства
Пример: перечисление семейств шрифтов
Редактирование текстового документа: пример CapsEditor
Invalidate()
Вычисление размеров элементов и размеров документа
OnPaint()
Преобразования координат
Реакция на пользовательский ввод
Печать
Реализация команд меню Print и Print Preview
Резюме

Глава 31. Windows Presentation Foundation

Обзор
XAML
Кооперация дизайнеров и разработчиков
Иерархия классов
Пространства имен
Фигуры
Элементы управления
Простые элементы управления
Элементы управления с содержимым
Элементы управления с содержимым и заголовками
Многоэлементные элементы управления
Многоэлементные элементы управления с заголовками
Компоновка
StackPanel
WrapPanel
Canvas
DockPanel
Grid
Обработка событий
Команды
Стили, шаблоны и ресурсы
Стили
Ресурсы
Триггеры
Шаблоны
Стилизация ListBox
Анимация
Привязка данных
Общий обзор
Привязка с XAML
Привязка простого объекта
Объектный поставщик данных
Привязка списка
Привязка к XML
Интеграция Windows Forms
Элементы управления WPF в приложениях Windows Forms
Элементы управления Windows Forms в приложениях WPF
Резюме

Глава 32. Страницы ASP.NET

Введение в ASP.NET
Управление состоянием в ASP.NET
ASP.NET Web Forms
Модель кода ASP.NET
Серверные элементы управления ASP.NET
ADO.NET и привязка данных
Усовершенствование приложения заказа мероприятий
Дополнительные сведения о связывании данных
Конфигурация приложения
Резюме

Глава 33. Разработка приложений с использованием ASP.NET

Настраиваемые элементы управления
Пользовательские элементы управления
Пользовательские элементы управления в PCSDemoSite
Настраиваемые элементы управления
Ведущие страницы
Доступ к содержимому ведущих страниц с Web-страниц
Ведущие страницы в PCSDemoSite
Навигация по сайту
Навигация в PCSDemoSite
Безопасность
Добавление аутентификации с помощью
с применением мастера Security Wizard
Реализация системы входа
Web-серверные элементы управления для входа на сайт
Защита каталогов
Безопасность в PCSDemoSite
Темы
Применение темы к странице
Определение тем
Темы в PCSDemoSite
Web Parts
Компоненты приложения Web Parts
Пример Web Parts
Резюме

Глава 34. ASP.NET AJAX

Что такое Ajax?
Что такое ASP.NET AJAX?
Центральная функциональность
ASP.NET AJAX Control Toolkit
ASP.NET 2.0 AJAX Futures CTP
ASP.NET AJAX-ориентированные Web-сайты
Пример ASP.NET AJAX-ориентированного Web-сайта
Конфигурация ASP.NET AJAX-ориентированного Web-сайта
Добавление функциональности ASP.NET AJAX
Использование AJAX Library
Резюме

Часть VI. Коммуникации

Глава 35. Доступ в Internet

Класс WebClient
Загрузка файлов из Web
Базовый пример Web-клиента
Загрузка файлов в Web
Классы WebRequest и WebResponse
Другие средства WebRequest и WebResponse
Отображение результата в виде HTML-страницы
Обеспечение простого просмотра Web из ваших приложений
Запуск экземпляров Internet Explorer
Доступ к дополнительным возможностям Internet Explorer из приложения
Печать документов с помощью WebBrowser
Отображение кода загруженной страницы
Иерархия WebRequest и WebResponse
Служебные классы
URI
IP-адреса и имена DNS
Протоколы низкого уровня
Классы наиболее низкого уровня
Резюме

Глава 36. Web-службы и ASP.NET

SOAP
WSDL
Web-службы
Поставка Web-служб
Доступные типы для Web-служб
Использование Web-служб
Расширение примера заказа мероприятий
Web-служба заказа мероприятий
Клиент заказа мероприятий
Обмен данными с использованием заголовков SOAP
Резюме

Глава 37. .NET Remoting

Что такое .NET Remoting?
CLR Object Remoting
Обзор .NET Remoting
Контексты
Активизация
Атрибуты и свойства
Коммуникации между контекстами
Удаленные объекты, клиенты и серверы
Удаленные объекты
Простой сервер
Простой клиент
Архитектура .NET Remoting
Каналы
Форматировщики
Классы ChannelServices и RemoteConfi guration
Активизация объектов
Приемники сообщений
Передача объектов в методах удаленных объектов
Безопасность и сериализуемые объекты
Управление временем жизни
Другие средства .NET Remoting
Конфигурационные файлы
Отсроченная загрузка клиентских каналов
Поставщики форматировщиков
Хостинг серверов в ASP.NET
Классы, интерфейсы и утилита Soapsuds
Асинхронное удаленное взаимодействие
Безопасность .NET Remoting
Удаленное взаимодействие и события
Контексты вызовов
Резюме

Глава 38. Службы уровня предприятия

Обзор
История появления
Где должны применяться службы уровня предприятия
Контексты
Автоматические транзакции
Распределенные транзакции
Пулы объектов
Безопасность на основе ролей
Очередизация компонентов
Слабо связанные события
Создание простого приложения COM+
Класс ServicedComponent
Подпись сборки
Атрибуты сборки
Создание компонента
Развертывание
Автоматическое развертывание
Ручное развертывание
Создание инсталляционного пакета
Проводник Component Services Explorer
Клиентское приложение
Транзакции
Атрибуты транзакций
Результаты транзакций
Пример приложения
Классы сущностей
Компонент OrderControl
Компонент OrderData
Компонент OrderLineData
Клиентское приложение
Интеграция WCF и служб уровня предприятия
Фасад службы WCF
Клиентское приложение
Резюме

Глава 39. Организация очередей сообщений

Обзор
Когда нужно использовать Message Queuing
Средства Message Queuing
Продукты Message Queuing
Архитектура Message Queuing
Сообщения
Очередь сообщений
Административные инструменты Message Queuing
Создание очереди сообщений
Свойства очереди сообщений
Программирование Message Queuing
Создание очереди сообщений
Поиск очереди
Открытие известных очередей
Отправка сообщения
Прием сообщений
Приложения заказа учебных курсов
Библиотека классов для приложения заказа учебных курсов
Отправитель сообщений о заказе учебных курсов
Отправка приоритетов и восстановимых сообщений
Приемник сообщений о заказе учебных курсов
Получение результатов
Подтверждающие очереди
Очереди ответов
Транзакционные очереди
Инсталляция Message Queuing
Резюме

Глава 40. Windows Communications Foundation

Обзор
Простая служба и клиент
Контракт службы
Реализация службы
Хост службы
Клиент
Контракты
Контракт службы
Контракт данных
Контракт сообщений
Реализация службы
Привязка
Хостинг
Клиенты
Дуплексная коммуникация
Резюме

Глава 41. Windows Workflow Foundation

Пример ''Hello World''
Действия
IfElseActivity
ParallelActivity
CallExternalMethodActivity
DelayActivity
ListenActivity
Модель выполнения действий
Пользовательские действия
Верификация действий
Темы и конструкторы
ActivityToolboxItem и пиктограммы
Пользовательские составные действия
Рабочие потоки
Последовательные рабочие потоки
Рабочие потоки типа конечных автоматов
Передача параметров рабочему потоку
Возврат результатов из рабочего потока
Привязка параметров к действиям
Исполняющая среда рабочего потока
Службы рабочих потоков
Служба постоянства
Служба отслеживания
Пользовательские службы
Хостинг рабочих потоков
Конструктор Workflow Designer
Резюме
Указания по загрузке

Глава 42. Службы каталогов

Архитектура Active Directory
Возможности
Концепции Active Directory
Характеристика данных службы Active Directory
Схема
Инструменты администрирования Active Directory
Оснастка Active Directory Users and Computers
Редактор ADSI Edit
Программирование для Active Directory 1521
Классы пространства имен System.DirectoryServices
Привязка
Получение записей каталога
Коллекции объектов
Кэш
Создание новых объектов
Обновление записей в каталоге
Доступ к собственным объектам ADSI
Поиск в Active Directory
Поиск пользовательских объектов
Интерфейс пользователя
Извлечение контекста именования схемы
Извлечение имен свойств пользовательского класса
Поиск пользовательских объектов
Язык DSML
Классы пространства имен System.DirectoryServices.Protocols
Поиск объектов Active Directory с помощью DSML
Резюме

Часть VII. Дополнительные сведения (на компакт-диске)

Глава 43. C#, Visual Basic и C++/CLI (на компакт-диске)

Пространства имен
Определение типов
Ссылочные типы
Типы значений
Интерфейсы
Перечисления
Методы
Параметры методов и типы возврата
Модификаторы параметров
Конструкторы
Свойства
Статические члены
Массивы
Управляющие операторы
Оператор if
Условная операция
Оператор switch
Циклы
Оператор for
Операторы while и do..while
Оператор foreach
Обработка исключений
Наследование
Модификаторы доступа
Ключевые слова
Управление ресурсами
Реализация интерфейса IDisposable
Оператор using
Переопределение Finalize
Делегаты
События
Обобщения
Смешивание ''родного'' и управляемого кода в C++/CLI
Резюме

Глава 44. Windows Vista (на компакт-диске)

Vista Bridge
Управление пользовательскими учетными записями
Приложения, требующие административных привилегий
Защитная пиктограмма
Структура каталогов
Новые элементы управления и диалоговые окна
Диалог задачи
Файловые диалоги
Поиск
Поставщик OLE DB
Расширенный синтаксис запросов
Резюме

Глава 45. Язык интегрированных запросов (на компакт-диске)

Традиционные запросы
Запрос к списку объектов
Запрос к базе данных
XML
Запрос LINQ
Списки объектов
Реляционные данные
XML
Выражения запросов
Методы расширения
Стандартные операции запросов
Лямбда-выражения
Отложенное выполнение запросов
Деревья выражений
Вывод типов
Инициализаторы объектов и коллекций
Анонимные типы
Резюме

Часть VIII. Приложения (на компакт-диске)
Приложение А. Принципы объектно-ориентированного программирования (на компакт-диске)
Приложение Б. C# для разработчиков на Visual Basic 6 (на компакт-диске)
Приложение В. C# для разработчиков на Java (на компакт-диске)
Приложение Г. C# для разработчиков на C++ (на компакт-диске)

Предметный указатель

Об авторах

Кристиан Нейгел (Christian Nagel) - архитектор программного обеспечения, разработчик и компаньон Thinktecture; он занимается обучением и консультациями по проектированию и разработке решений на базе Microsoft .NET. Имеет за плечами более чем 20-летний опыт разработчика и программного архитектора. Кристиан начинал свою компьютерную карьеру на системах PDP 11 и VAX/VMS, и имел дело с множеством языков и платформ. Начиная с 2000 года, когда появилась предварительная версия .NET, он использует различные технологии .NET при построении распределенных решений. Обладая фундаментальными знаниями технологий Microsoft, является автором ряда книг по .NET; имеет сертификаты Microsoft Certified Trainer (MCT), Microsoft Professional Developer (MCPD) для Windows, Web и Enterprise Applications; является региональным директором Microsoft по ASP.NET. Кроме того, Кристиан выступает с докладами на международных конференциях (TechED, TechDays) и занимается поддержкой групп пользователей .NET в INETA Europe (International .NET Association).

Связаться с Кристианом можно через его Web-сайты www.christiannagel.com и www.thinktecture.com.

Билл Ивьен (Bill Evjen) - активный сторонник технологий .NET и инициатор учебных программ сообществ разработчиков .NET. Интенсивно занимается .NET, начиная с его первых выпусков в 2000 году. С тех пор является основателем группы пользователей .NET Сент-Луиса (www.stlnet.org) - одной из первых подобных групп в мире. Билл также является основателем и исполнительным директором Международной Ассоциации .NET (http://www.ineta.org), в которую входит более 450 000 членов со всего мира.

Проживая в Сент-Луисе, штат Миссури, США, Билл является известным автором и лектором по теме ASP.NET и Web-служб XML. Он был автором и соавтором в таких книгах, как Professional C# 2005 (C# 2005 для профессионалов, "Диалектика", 2006), Professional VB 2005, Professional ASP.NET 2.0, ASP.NET Professional Secrets, XML Web Services for ASP.NET, Web Services Enhancements: Understanding the WSE for Enterprise Applications, Visual Basic .NET Bible (Microsoft Visual Basic .NET. Библия пользователя, "Диалектика", 2002). Кроме того, Билл выступает с докладами на множестве конференций, среди которых DevConnections, VSLive и TechEd, а также тесно сотрудничает с Microsoft, занимая пост регионального директора.

Билл работает техническим архитектором в Lipper (www.lipperweb.com), дочерней компании Reuters - международного агентства новостей и финансовых служб.

Окончил Университет Западного Вашингтона в Беллингеме, Вашингтон, по специальности "русский язык". В свободное от работы время Билл отдыхает в летнем домике в Тойвакке (Финляндия). Вы можете обратиться к Биллу по адресу evjen@yahoo.com, а также через его журнал www.geekswithblogs.net/evjen.

Морган Скиннер (Morgan Skinner) начинал свою карьеру, связанную с компьютерами, еще в подростковом возрасте, в школе, на Sinclair ZX80, когда пришел в восторг, увидев код, написанный учителем, и увлекся программированием на ассемблере.

После того, как он с головой погрузился в Z80 (который, как он считает, устроен намного лучше, чем эти жалкие 3 регистра на 6502), постепенно перешел от школьного ZX81 к собственному ZX Spectrum.

С тех пор перепробовал множество языков и платформ, включая VAX Macro Assembler, Pascal, Modula2, Smalltalk, язык ассемблера X86, PowerBuilder, C/C++, VB и, наконец, в настоящее время - C#. Программирует с использованием .NET, начиная с выпуска PDC 2000 года. Ему это так понравилось, что в 2001 году он присоединился к Microsoft. Сейчас работает в подразделении первичной поддержки разработчиков, и большую часть времени тратит на оказание помощи по языку C#.

Обратиться к Моргану можно на его Web-сайте по адресу www.morganskinner.com.

Джей Глинн (Jay Glynn) начал программировать около 20 лет назад, разрабатывая приложения для операционной системы PICK на языке PICK Basic. С тех пор он писал на Paradox PAL, Object PAL, Delphi, VBA, Visual Basic, C, C++, Java и, конечно же, на C#. В настоящее время является координатором проектов и архитектором в крупной финансовой компании в Нашвилле, штат Теннесси, работая над программным обеспечением для платформы TabletPC. Связаться с ним можно по адресу jlsglynn@hotmail.com.

Карли Уотсон (Karli Watson) - независимый автор и технический директор компании 3form Ltd (http://www.3form.net). Несмотря на то что он начинал с изучения нанофизики, привлеченный хорошими заработками в компьютерной области, сменил специальность. С тех пор написал ряд книг по .NET и связанным технологиям, SQL, мобильным вычислениям, а также роман, который пока еще не вышел в свет (он совершенно не связан с компьютерами). Карли можно узнать по разноцветной одежде, поскольку он - энтузиаст сноуборда, кроме того, он все еще хочет завести кота.

Введение

Если мы скажем, что язык C# и связанная с ним среда .NET Framework является одной из самых важных технологий для разработчиков за много лет, это не будет преувеличением. .NET спроектирована как новая среда, в рамках которой можно разработать практически любое приложение для Windows, в то время как C# - новый язык программирования, предназначенный специально для работы с .NET. С помощью C# вы можете, например, создавать динамическую Web-страницу, Web-службу XML, компонент распределенного приложения, компонент доступа к базе данных, классическое Windows-приложение рабочего стола или даже интеллектуальное клиентское приложение, имеющее возможность онлайновой и автономной работы. Настоящая книга посвящена .NET Framework 2.0 и новому ее выпуску - .NET Framework 3.0. Если вы имеете опыт кодирования в версиях 1.0, 1.1 или 2.0, то, возможно, встретите разделы, в которых не найдете для себя ничего нового. Мы старались специально отмечать те элементы, которые впервые появились в .NET Framework 3.0.

Пусть вас не смущает марка ".NET". Часть "NET" в имени подчеркивает уверенность Microsoft в том, что распределенные приложения, в которых обработка распределена между клиентом и сервером - это движение вперед, но C# - не только язык для написания Internet-приложений или любых сетевых приложений. Он предоставляет средства для кодирования программного обеспечения практически любого типа или компонентов, которые может понадобиться написать для платформы Windows.

Между тем, C# и .NET призваны перевернуть способ написания программ, и сделать программирование для Windows намного легче, чем оно когда-либо было.

Это довольно самонадеянное утверждение, и оно требует доказательств. В конце концов, мы все знаем, насколько быстро меняются компьютерные технологии. Каждый год Microsoft выпускает новое программное обеспечение, инструменты программирования, версии Windows, при этом утверждая, что они в высшей степени хороши для разработчиков. Так в чем же отличие .NET и C#?

Значение .NET и C#

Чтобы понять истинное значение .NET, полезно вспомнить природу многих технологий Windows, которые появились за последние десять лет или около того. Хотя внешне они могут показаться совсем непохожими, но все операционные системы, начиная с Windows 3.1 (представленной в 1992 году), и до Windows Server 2003, имеют в своем ядре один и тот же программный интерфейс Windows API. С каждой новой версией Windows к этому API добавляется огромное число новых функций, но все это - процесс эволюции и расширения API, а не замена его.

То же самое можно сказать о многих новых технологиях и средах (каркасах), которые мы использовали для разработки программного обеспечения Windows. Например, о модели COM (Component Object Model - объектная модель компонентов), изначально возникшей как OLE (Object Linking and Embedding - связывание и внедрение объектов). Во времяее появления она была просто средством, с помощью которого можно было связывать разные типы документов Office, так что, например, вы могли поместить небольшую таблицу Excel в документ Word. Затем она эволюционировала до COM, DCOM (Distributed COM - распределенная COM) и в конечном итоге появилась COM+ - развитая технология, формирующая базу для взаимодействия почти всех компонентов, также реализующая транзакции, службы сообщений и пулы объектов.

Microsoft выбрала этот эволюционный подход к программному обеспечению по очевидной причине - заботясь об обратной совместимости. За многие годы независимыми разработчиками для Windows был разработан гигантский объем программного обеспечения, и Windows не достигла бы такого успеха, если бы всякий раз, когда Microsoft представляла новую технологию, существующая кодовая база переставала бы работать!

В то время как обратная совместимость всегда была важнейшим свойством технологий Windows и одной из сильных сторон платформы Windows, она также имела большой недостаток. Всякий раз, когда технология развивалась и добавлялись новые средства, это приводило к усложнению по сравнению с тем, что было раньше.

Стало ясно, что нужно что-то менять. Microsoft не могла до бесконечности расширять существующие средства разработки и языки, постоянно все более усложняя их, чтобы удовлетворить противоречивые требования поддержки нового оборудования и обратной совместимости с тем, что было во времена, когда Windows впервые стала популярной - в начале 90-х прошлого века. Наступил момент, когда нужно было начать с чистого листа, имея простой, но достаточный набор языков, сред и средств разработки, которые позволили бы разработчиками легко писать полезное и работоспособное программное обеспечение.

Таким "началом с нуля" стали C# и .NET. Грубо говоря, .NET - это каркас, API-интерфейс для программирования на платформе Windows. Вместе с .NET Framework, C# представляет собой язык, спроектированный "с нуля", предназначенный для работы с .NET и впитавший в себя все достижения прогресса сред разработки и понимание принципов объектно-ориентированного программирования, которое выкристаллизовалось за последние 20 лет.

Прежде чем продолжить, следует пояснить, что обратная совместимость вовсе не была утеряна. Существующие программы продолжают работать, и каркас .NET спроектирован так, что способен работать с этим существующим программным обеспечением. В настоящее время коммуникации между программными компонентами Windows почти целиком строятся с использованием COM. Принимая это во внимание, .NET предоставляет оболочки вокруг существующих компонентов COM, так что компоненты .NET могут свободно общаться с ними.

Правда, вы не обязаны изучать C#, чтобы писать код для .NET. Microsoft предлагает расширенный C++, еще один новый язык, называемый J#, а также вносит существенные изменения в Visual Basic, превратив его в более мощный язык - Visual Basic .NET, чтобы позволить на любом из этих языков разрабатывать приложения, ориентированные на среду .NET. Однако все эти языки скорее представляют собой результат эволюции в течение ряда лет, и не разработаны изначально с учетом требований современных технологий.

Эта книга научит вас программировать на C#, одновременно закладывая необходимый фундамент знаний о работе архитектуры .NET. Мы не только раскроем основы языка C#, но также представим примеры приложений, использующих широкий диапазон взаимосвязанных технологий, включая доступ к базам данных, динамические Web-страницы, расширенную графику и доступ к каталогам. Единственное требование - чтобы вы были знакомы хотя бы с одним из других высокоуровневых языков программирования, используемых в Windows - C++, Visual Basic или J++.

Преимущества .NET

Мы уже говорили в общих чертах о том, насколько замечателен .NET, но пока не сказали ничего о том, как он облегчает жизнь вам как разработчику. В этом разделе мы кратко опишем некоторые усовершенствованные средства .NET.

Что нового в .NET Framework 2.0

Первая версия .NET Framework (1.0) была реализована в 2002 году с огромным энтузиазмом. Следующая версия - .NET Framework 2.0 - была представлена в 2005 году и рассматривается как главный выпуск этой среды. В каждом выпуске Microsoft всегда старается обеспечить сохранение работоспособности ранее написанного кода. До сих пор им удавалось успешно достигать этой цели. Создайте установочный сервер, чтобы полностью протестировать обновление ваших приложений для .NET Framework 2.0 вместо простого обновления работающих приложений.

Ниже мы детализируем некоторые изменения, внесенные в .NET Framework, а также дополнения Visual Studio 2005 - среды разработки для .NET Framework 2.0.

Интеграция с SQL Server

После долгого перерыва наконец-то вышла последняя версия SQL Server. Эта версия, SQL Server 2005, во многих отношениях особенная. Для разработчика .NET важнее всего то, что .NET Framework 2.0, Visual Studio 2005 и SQL Server 2005 теперь тесно между собой связаны - в том смысле, что реализованы в сочетании. Это достаточно важно, поскольку известно, что большинство приложений строятся с применением этих всех трех частей, и что они должны обновляться совместно, чтобы работать друг с другом в прозрачной согласованной манере.

Благодаря тому факту, что теперь сам SQL Server 2005 служит хостом для CLR (Common Language Runtime - общеязыковая исполняющая среда), можно избежать построения аспектов ваших приложений, связанных с базами данных, с применением языка T-SQL. Вместо этого можно строить такие элементы, как хранимые процедуры, триггеры и даже типы данных, на любом совместимом с .NET языке, например, на C#. SQL Server Express - это версия SQL Server 2005 года, которая заменила MSDE. Эта версия лишена тех строгих ограничений, которые были присущи MSDE.

Поддержка 64-разрядных вычислений

Большая часть программирования в наши дни выполняется на 32-разрядных машинах. Это было огромным шагом вперед в разработке приложений, когда компьютеры из 16-разрядных превратились в 32-разрядные. Но все больше и больше предприятий переходят на самые современные 64-разрядные серверы от таких компаний, как Intel (с процессорами Itanium) и AMD (с процессорами x64), и .NET Framework 2.0 теперь включает 64-разрядную поддержку такой миграции. Специалисты в Microsoft интенсивно трудились над тем, чтобы все, что вы строите в 32-разрядном мире .NET, работало в мире 64-разрядном. Это значит, что на все, что вы делаете с SQL Server 2005 или ASP.NET, переход на 64-разрядные машины никак не повлияет. Было внесено множество изменений в CLR, чтобы заставить работать 64-разрядную версию .NET. Изменения коснулись таких вещей, как сборка мусора (чтобы обрабатывать большие объемы данных), процесс компиляции JIT, обработка исключений и многое другое.

Переход на 64-разрядную архитектуру предлагает некоторые значительные преимущества. Наиболее важно (и это - самая очевидная причина), что 64-разрядные серверы поддерживают большее адресное пространство. Переход на 64 разряда также позволяет сделать примитивные типы большими, чем раньше. Например, целое значение 232 дает 4 294 967 296, в то время как 264 - уже 18 446 744 073 709 551 616. Это очень удобно для тех приложений, которым нужно вычислять вещи вроде государственного долга США или другие большие числа.

Такие компании, как Microsoft и IBM, подталкивают своих клиентов обратить внимание на 64-разрядные системы. Одними из главных областей применения являются средства баз данных и средства виртуального хранения - именно здесь переход на 64-разрядную архитектуру наиболее оправдан.

Visual Studio 2005 можно инсталлировать и запустить на 64-разрядном компьютере. IDE-среда Visual Studio 2005 включает в себя и 32-разрядный, и 64-разрядный компиляторы. Одно предупреждение: 64-разрядный .NET Framework предназначен только для Windows Server 2003 SP1 или выше либо для других 64-разрядных операционных систем Microsoft, которые могут появиться в будущем.

Когда вы строите свое приложение на Visual Studio 2005, то можете изменять свойства проекта так, чтобы оно было скомпилировано специально для 64-разрядных компьютеров. Чтобы найти эти настройки, следует обратиться открыть окно свойств приложения и перейти в нем на вкладку Build (Построение). На вкладке Build щелкните на кнопке Advanced (Дополнительно), после чего появится диалоговое окно Advanced Compiler Setting (Дополнительные настройки компилятора). В нижней части этого окна можно изменить тип целевого процессора. Здесь вы можетеуказать, чтобы ваше приложение было построено либо для 64-разрядного компьютера Intel, либо 64-разрядного компьютера AMD.

Обобщения

Чтобы сделать коллекции более мощным средством и также повысить их эффективность и удобство, в .NET Framework 2.0 были представлены обобщения (generics).

Это нововведение означает, что такие языки, как C# и Visual Basic 2005, теперь могут строить приложения, использующие обобщенные типы. Идея обобщений не нова. Они выглядят подобно шаблонам C++, хотя несколько отличаются от них. Обобщения можно найти и в других языках, например, в Java. Их появление в языках .NET Framework 2.0 выглядит как ценный подарок пользователям.

Обобщения позволяют создавать обобщенные коллекции, которые, тем не менее, строго типизированы - что оставляет меньше шансов допустить ошибку (потому что они выявляются во время компиляции), повышает производительность и предоставляет в ваше распоряжение средство IntelliSense (автоматическое завершение конструкций кода), когда вы работаете с коллекциями.

Чтобы применить обобщения в коде, необходимо обратиться к пространству имен System.Collections.Generic. Это откроет доступ к обобщенным версиям классов Stack, Dictionary, List и Queue. Рассмотрим пример, демонстрирующий использование обобщенной версии класса Stack:

void Page_Load(object sender, EventArgs e)
{
   System.Collections.Generic.Stack<string> myStack =
   New System.Collections.Generic.Stack<string>();
   myStack.Push("St. Louis Rams");
   myStack.Push("Indianapolis Colts");
   myStack.Push("Minnesota Vikings");
   Array myArray;
   myArray = myStack.ToArray();
   foreach(string item in myArray)
   {
      Label1.Text += item + "<br />";
   }
}

В этом примере класс Stack явно приведен, чтобы содержать в себе элементы типа string. Здесь вы специфицируете тип коллекции с применением угловых скобок. То есть, в этом примере класс Stack приводится к типу string с использованием синтаксиса Stack<string>. Если вы захотите привести его к чему-то другому, отличному от класса Stack элементов string (например, элементов int), то должны будете специфицировать Stack<int>.

Поскольку коллекция элементов в классе Stack приведена к специфическому типу непосредственно при создании класса Stack, нет необходимости приводить его элементы к типу object и позднее (в цикле foreach) - обратно к типу string. Этот процесс называется упаковкой и обходится недешево. Поскольку в этом коде типы специфицированы заранее, возрастает производительность работы с коллекцией.

В дополнение к сказанному о различных типах коллекций, вы также можете использовать обобщения с классами, делегатами, методами и тому подобным. Механизм обобщений детально раскрыт в главе 9.

Анонимные методы

Анонимные методы позволяют поместить программный код внутрь делегата, так что его можно выполнить позднее вместо создания совершенно нового метода.

Например, если вы не используете анонимные методы, то должны применять делегат в манере, подобной следующему:

public partial class Default_aspx {
   void Page_Load(object sender, EventArgs e)
   {
       this.Button1.Click += ButtonWork;
   }
   void ButtonWork(object sender, EventArgs e)
   {
      Label1.Text = "Вы щелкнули на кнопке!";
   }
}

Однако с помощью анонимных методов можно поместить необходимое действие непосредственно в делегат, как показано в следующем примере:

public partial class Default_aspx
{
   void Page_Load(object sender, EventArgs e)
   {
      this.Button1.Click += delegate(object myDelSender, EventArgs myDelEventArgs)
      {
         Label1.Text = "Вы щелкнули на кнопке!";
      };
   }
}

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

Типы, допускающие null

Благодаря появлению обобщений в основе .NET Framework 2.0 стало возможно создавать типы, допускающие null-значения - используя System.Nullable<T>. Это идеальное решение для ситуаций, когда, например, нужно создавать наборы элементов типа int, в которых могут содержаться значения null. Раньше всегда было трудно создать int со значением null изначально или же присваивать null переменным int.

Чтобы создать допускающий null тип int, вы должны использовать следующий синтаксис:

System.Nullable<int> x = new System.Nullable<int>;

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

int? salary = 800000

Такая способность объявлять типы, допускающие null, не является свойством исключительно C#, поскольку встроена в .NET Framework и стала возможной благодаря появлению средства обобщений в .NET. По этой причине вы также найдете типы, допускающие null, и в Visual Basic 2005.

Итераторы

Итераторы позволяют использовать циклы foreach с вашими собственными пользовательскими типами. Чтобы достичь этого, необходимо, чтобы ваш класс реализовывал интерфейс IEnumerable, как показано ниже:

using System;
using Systm.Collections;
public class myList
{
   internal object[] elements;
   internal int count;
   public IEnumerator GetEnumerator()
   {
      yield return "St. Louis Rams";
      yield return "Indianapolis Colts";
      yield return "Minnesota Vikiings";
   }
}

Чтобы использовать интерфейс IEnumerable, необходимо сослаться на пространство имен System.Collections. Имея все это, вы можете выполнять итерации по своему пользовательскому классу, как показано ниже:

void Page_Load(object sender, EventArgs e)
{
   myList IteratorList = new myList();
   foreach(string item in IteratorList)
   {
      Response.Write(item.ToString() + "<br />");
   }
}

Частичные классы

Частичные (partial) классы - новое средство .NET Framework 2.0, и C# опять использует преимущества этого нововведения. Частичные классы позволяют вам разделить один класс на множество файлов, которые позднее, при компиляции, комбинируются в единый класс. Чтобы объявить частичный класс, нужно просто использовать ключевое слово partial в любых классах, которые должны объединяться с другими, формируя единый класс. Ключевое слово partial предшествует имени класса, который комбинируется с оригинальным классом. Например, у вас может быть простой класс Calculator, объявленный следующим образом:

public class Calculator
{
   public int Add(int a, int b)
   {
      return a + b;
   }
}

С этого момента вы можете создать второй класс, который присоединится к первому, как показано ниже:

public partial class Calculator
{
   public int Subtract(int a, int b)
   {
      return a - b;
   }
}

При компиляции эти классы будут собраны вместе в единый класс Calculator, как если бы они изначально составляли единое целое.

Введение в .NET Framework 3.0

Последней версией каркаса .NET является .NET Framework 3.0. Эта версия предлагает несколько исключительно новых возможностей, среди которых построение приложений нового типа с использованием Windows Presentation Foundation (WPF), а также приложений и библиотек на основе Windows Communication Foundation (WCF), Windows Workflow Foundation (WF) и Windows CardSpace. Упомянутые дополнения - это именно то, что и образует .NET Framework 3.0. В настоящей книге им посвящено множество глав.

Для чего подходит C#

В определенном смысле C# по отношению к языкам программирования представляет собой то же самое, что .NET по отношению к среде Windows. Точно так же, как Microsoft добавляла все больше и больше средств к Windows и Windows API в течение последнего десятилетия, так и Visual Basic 2005 и C++ подвергались постоянному расширению. Хотя Visual Basic и C++ в результате этого стали весьма мощными языками, оба они страдают от проблем, связанных с "тяжелым наследием" их эволюции.

В случае Visual Basic 6 и ранних версий сильная сторона языка определялась тем фактом, что его было легко понять, и он значительно облегчал решение многих задач программирования, скрывая от разработчиков детали Windows API и инфраструктуру компонентов COM. Отрицательная же сторона состояла в том, что Visual Basic никогда не был по-настоящему объектно-ориентированным, так что крупные приложения быстро теряли внутреннюю организацию, и их становилось трудно сопровождать.

К тому же, поскольку синтаксисVisual Basic был унаследован от ранних версий BASIC (который, в свою очередь, был задуман скорее как простой для понимания начинающими программистами язык, нежели для написания крупных коммерческих приложений), на самом деле он не был приспособлен для построения хорошо структурированных объектно-ориентированных программ.

С другой стороны, корни C++ относятся к определению языка ANSI C++. Он не полностью совместим со стандартом ANSI (хотя и близок к нему) по той простой причине, что Microsoft впервые разработала свой компилятор C++ до того, как определение ANSI стало официальным. К сожалению, это привело к двум проблемам. Во-первых, корни ANSI C++ лежат в технологиях двадцатилетней давности, поэтому ему не хватает поддержки современных концепций (таких как строки Unicode и генерация XML-документации), и он содержит некоторые архаичные синтаксические структуры, предназначенные для компиляторов прошлых лет (такие как отделение объявления от определения функций-членов). Во-вторых, разработчики Microsoft одновременно пытаются развивать C++, чтобы он стал языком, предназначенным для выполнения высокопроизводительных задач под Windows, а потому вынуждены были добавить к нему огромное количество специфичных для Microsoft ключевых слов и разнообразных библиотек. В результате язык С++ для Windows стал чрезвычайно "запутанным". Попробуйте спросить разработчиков C++, сколько определений строковых типов они знают: char*, LPTSTR, string, CString (версия MFC), CString (версия WTL), wchar_t*, OLECHAR* и так далее и тому подобное:

Теперь появилась .NET - полностью новая среда, которая повлекла за собой появление новых расширений обоих языков. Microsoft добавила еще больше специфичных ключевых слов с C++, и провела полную реконструкцию Visual Basic, создав Visual Basic .NET и Visual Basic 2005 - язык, который унаследовал некоторый базовый синтаксис VB, но дизайн которого полностью отличается от того, к чему мы привыкли; он практически стал совершенно новым языком.

В упомянутом контексте Microsoft решила предложить разработчикам альтернативу - язык, ориентированный специально на .NET, к тому же спроектированный с чистого листа. В результате появился Visual C# 2005. Официально Microsoft описывает C# как "простой, современный, объектно-ориентированный и безопасный к типам язык программирования, унаследованный от C и C++". Большинство независимыхобозревателей, вероятно, изменили бы это на "унаследованный от C, C++ и Java". Такое описание является технически точным, но мало что говорит о красоте и элегантности языка. Синтаксически C# очень похож на C++ и Java, в том смысле, что многие ключевые слова - те же, кроме того, C# также разделяет с языками C++ и Java ту же блочную структуру с фигурными скобками для выделения блоков кода и точками с запятой для завершения операторов. Первое впечатление от фрагмента кода C# состоит в том, что он выглядит подобно C++ или Java. Но, несмотря на это внешнее сходство, C# изучить намного легче, чем C++, и по сложности освоения он примерно равен Java. Его дизайн в большей степени соответствует современным инструментам разработки, чем у обоих его предшественников, и он предлагает простоту в использовании, как у Visual Basic, вместе с высокой производительностью и низкоуровневым доступом к памяти, характерные для C++, когда это необходимо. Ниже перечислены возможности C#, которые следует отметить особо.

Полная поддержка классов и объектно-ориентированного программирования, включая наследование реализации и интерфейсов, виртуальные функции и перегрузку операций.

Большая часть перечисленного также касается Visual Basic 2005 и управляемого C++. Тот факт, что C# изначально спроектирован для работы с .NET, однако, означает, что он поддерживает средства .NET в более полной мере, и предлагает в этом контексте более подходящий синтаксис, чем прочие языки. Хотя язык C# сам по себе очень похож на Java, есть несколько существенных преимуществ. В частности, язык Java не предназначен для работы в среде .NET.

Прежде чем завершить тему, следует отметить и ряд ограничений C#. Одна область, для которой данный язык не предназначен - это критичный по времени или исключительно высокопроизводительный код - когда приходится заботиться о том, чтобы цикл занимал 1000 или 1050 тактов процессора, когда необходимо очищать ресурсы в течение миллисекунд после того, как отпадает потребность в них. Вероятно, C++ продолжает оставаться самым непревзойденным из высокоуровневых языков в этой области. C# недостает некоторых ключевых средств для построения наиболее высокопроизводительных приложений, включая возможность специфицировать встроенные функции и деструкторы, которые гарантированно запускаются в определенной точке кода. Однако пропорциональное отношение таких приложений к их общему числу чрезвычайно низко.

Что необходимо для написания и выполнения кода C#

.NET Framework работает под управлением Windows 98, 2000, XP и 2003. Чтобы писать код, используя .NET, необходимо инсталлировать .NET SDK, если только вы не используете Windows Server 2003, который поставляется с предустановленной средой .NET Framework 1.0 и 1.1. Если вы собираетесь работать с примерами, представленными в этой книге, то потребуется инсталлировать .NET Framework 2.0, даже если вы работаете в среде Windows Server 2003. По умолчанию .NET Framework 2.0 не включена в этот сервер. .NET Framework 3.0 для своей работы требует одну из следующих операционных систем: Windows XP SP2, Windows Server 2003 SP1 или Windows Vista.

К тому же, если только вы не собираетесь писать код C#, используя текстовый редактор или некоторую среду разработки от независимых поставщиков, то почти наверняка захотите установить Visual Studio 2005. Полный SDK не требуется, чтобы выполнять управляемый код, но исполняющая среда .NET необходима. Возможно, вам понадобится поставлять ее вместе с вашим кодом для тех клиентов, у которых она еще не установлена.

Как организована эта книга

В главе 1 этой книги мы представим обзор общей архитектуры .NET, чтобы подготовить почву, которая нужна для разработки управляемого кода. Далее книга организована в виде набора разделов, в которых описывается как сам язык C#, так и его применение во многих областях.

Часть I. Язык C#

Эта часть закладывает хороший фундамент знаний о самом языке C#. Она не предполагает знания какого-либо конкретного языка, хотя предполагается, что вы - опытный программист. Мы начнем с обзора базового синтаксиса C# и его типов данных, а затем обсудим объектно-ориентированные возможности C#, после чего можно будет перейти к более сложным темам программирования на C#.

Часть II. Visual Studio

Эта часть посвящена главной IDE-среде, применяемой разработчиками на C# во всем мире - Visual Studio 2005. В двух главах этой части будут показаны лучшие способы использования этого инструмента для построения приложений на базе .NET Framework 2.0 и 3.0, а также рассматриваются вопросы развертывания проектов.

Часть III. Библиотеки базовых классов

В этой части рассматриваются принципы программирования в среде .NET. В частности, описываются концепции безопасности, многопоточность, локализация, транзакции, построение Windows-служб и генерация собственных библиотек в виде сборок.

Часть IV. Данные

Здесь рассматривается доступ к базам данных средствами ADO.NET и взаимодействие с каталогами и файлами. Также подробно раскрывается поддержка .NET технологии XML на стороне операционной системы Windows, а также средства .NET, встроенные в SQL Server 2005.

Часть V. Презентации

Эта часть сосредоточена на построении классических приложений Windows, которые в .NET называются Windows Forms. Windows Forms представляют собой версии приложений "толстого" клиента, а применение .NET для их построения - простой и быстрый способ решения этой задачи. В дополнение к рассмотрению Windows Forms рассматривается GDI+ - технология, используемая для построения приложений, работающих с расширенной графикой. В этой части также раскрываются компоненты, работающие на Web-сайтах, доставляющие Web-страницы. Сюда входит огромный объем новых средств, предлагаемых ASP.NET 2.0. Кроме того, в этой же части рассматриваются вопросы построения приложений на базе Windows Presentation Foundation.

Часть VI. Коммуникации

Эта частьполностью посвящена коммуникациям. Здесь описываются Web-службы, применяемые для коммуникаций, независящих от платформы, .NET Remoting - для коммуникаций между клиентами и серверами .NET, Enterprise Services (службы уровня предприятия) - для служб, работающих в фоновом режиме, и коммуникации DCOM.

На примере системы асинхронных сообщений показаны коммуникации в отключенном режиме. В этой части также рассматриваются вопросы использования Windows Communication Foundation и Windows Workflow Foundation.

Часть VII. Дополнительные сведения

В этой части рассматриваются вопросы построения приложений, которые используют новые возможности Windows Vista. Кроме того, здесь также дается описание формирующейся технологии LINQ и того, как она может применяться в приложениях на C#.

Часть VIII. Приложения

В состав этой части входит несколько приложений, детализирующих принципы объектно-ориентированного программирования, а также информация, специфичная для языка C#.

Исходный код

Работая с примерами этой книги, вы можете либо вводить весь их код вручную, либо использовать файлы исходного кода, находящиеся на прилагаемом к книге компакт-диске.

Комментарии