- •1. C# и платформа .Net 7
- •2. Создание приложений .Net с использованием c# 38
- •3. Основы c# 71
- •4. Массивы, кортежи и строки 118
- •5. Классы и объекты 157
- •6. Перегрузка функций-членов класса 195
- •7. Наследование и полиморфизм 214
- •8. Обработка исключений 231
- •9. Интерфейсы, структуры и перечисления 255
- •10. Делегаты, события и лямбда-выражения 270
- •11. Обобщения 296
- •12. Коллекции, перечислители и итераторы 323
- •13. Время жизни объектов 370
- •1.C# и платформа .Net
- •1.1Становление c#
- •Язык c и api-интерфейс Windows
- •1.2Создание c#
- •Развитие c#
- •1.3Версии c#
- •1.4Связь c# со средой .Net Framework
- •Что нового в .Net Framework 4
- •1.5Общеязыковая исполняющая среда clr
- •1.6Общая система типов cts
- •1.7Общеязыковая спецификация cls
- •1.8Сборки
- •Приватные сборки
- •Разделяемые сборки
- •Однофайловые и многофайловые сборки
- •1.9Промежуточный язык cil
- •Утилита ildasm.Exe
- •1.10Классы и пространства имен Классы .Net Framework
- •Пространства имен
- •Роль корневого пространства Microsoft
- •1.11Общеязыковая инфраструктура cli
- •2.Создание приложений .Net с использованием c#
- •2.2Компилятор csc.Exe
- •Добавление ссылок на внешние сборки
- •Компиляция нескольких файлов исходного кода
- •Работа с ответными файлами в c#
- •2.3Типы приложений .Net
- •Создание приложений asp.Net
- •Возможности asp.Net
- •Элементы управления веб-сервера
- •Создание Windows-форм
- •Службы Windows
- •2.4Работа с Visual Studio 2010
- •2.5Создание проекта в VisualStudio 2010
- •2.6Изучение проекта и заполнение его кодом
- •2.7Компоновка проекта
- •2.8Отладка кода
- •2.9Рефакторинг кода
- •2.10Расширение кода
- •2.11Утилита Class Designer
- •2.12Интегрируемая система документации .Net Framework
- •3.Основы c#
- •3.1Основы ооп
- •3.2Простая программа на c#
- •3.3Комментарии
- •3.4Переменные
- •3.5Область видимости переменных, константы
- •3.6Типы данных
- •3.7Литералы
- •3.8Преобразования типов
- •3.9Арифметические операторы
- •3.10Операторы отношения и логические операторы
- •If (var1 & var2) Console.WriteLine("Данный текст не выведется");
- •3.11Оператор присваивания
- •3.12Поразрядные операторы
- •3.13Тернарный оператор
- •3.14Условные операторы
- •If (условие)
- •3.15Циклы for и while
- •3.16Циклы do while и foreach
- •3.17Операторы перехода
- •4.Массивы, кортежи и строки
- •4.1Массивы
- •4.2Многомерные массивы
- •4.3Ступенчатые (зубчатые) массивы
- •4.4Класс Array
- •4.5Создание динамического массива
- •4.6Массивы в качестве параметров
- •4.7Кортежи
- •4.8Строки
- •Построение строк
- •Постоянство строк
- •Работа со строками
- •Методы класса String
- •Методы работы со строками
- •Немного о сравнении строк в c#
- •4.9Класс StringBuilder
- •Методы класса StringBuilder
- •4.10Форматирующие строки
- •Спецификаторы формата для чисел
- •Спецификаторы формата для дат
- •4.11Регулярные выражения в c#
- •4.11.1Введение в регулярные выражения
- •Метасимволы, используемые в регулярных выражениях c#
- •4.11.2Использование регулярных выражений в c#
- •Структура перечисления RegexOptions
- •Метасимволы замены в регулярных выражениях c#
- •5.Классы и объекты
- •5.1Классы
- •Общая форма определения класса
- •Данные-члены
- •5.2Класс Object
- •5.2.1Методы System.Object
- •5.2.2Класс object как универсальный тип данных
- •5.3Создание объектов
- •5.3.1Переменные ссылочного типа и присваивание
- •5.3.2Инициализаторы объектов
- •5.4Методы
- •Объявление методов
- •Возврат из метода и возврат значения
- •Использование параметров
- •5.5Конструкторы
- •5.6Сборка мусора и деструкторы
- •Деструкторы
- •5.7Ключевое слово this
- •5.8Доступ к членам класса
- •Модификаторы доступа
- •Организация закрытого и открытого доступа
- •5.9Модификаторы параметров
- •Модификаторы параметров
- •5.9.1Модификатор ref
- •5.9.2Модификатор out
- •5.9.3Модификатор params
- •5.10Необязательные и именованные аргументы
- •5.10.1Необязательные аргументы
- •5.10.2Именованные аргументы
- •5.11Рекурсия
- •5.12Ключевое слово static
- •5.12.1Статические конструкторы
- •5.12.2Статические классы
- •5.13Индексаторы
- •5.13.1Одномерные индексаторы
- •5.13.2Многомерные индексаторы
- •5.14Свойства
- •Автоматически реализуемые свойства
- •5.15Модификаторы доступа в аксессорах
- •6.Перегрузка функций-членов класса
- •6.1Перегрузка методов
- •6.2Перегрузка конструкторов
- •6.3Перегрузка индексаторов
- •6.4Основы перегрузки операторов
- •6.4.1Перегрузка бинарных операторов
- •6.4.2Перегрузка унарных операторов
- •6.4.3Выполнение операций со встроенными в c# типами данных
- •6.5Перегрузка операторов отношения и операторов true - false
- •6.5.1Перегрузка операторов отношения
- •6.5.2Перегрузка операторов true и false
- •6.6Перегрузка логических операторов
- •6.6.1Перегрузка укороченных логических операторов
- •6.7Операторы преобразования
- •7.Наследование и полиморфизм
- •7.1Основы наследования
- •7.2Защищенный доступ и исключение наследования
- •7.2.1Организация защищенного доступа
- •7.2.2Ключевое слово sealed
- •7.2.3Диаграммы классов Visual Studio
- •7.3Конструкторы и наследование
- •7.4Наследование и сокрытие имен
- •Применение ключевого слова base для доступа к скрытому имени
- •7.5Ссылки на базовый класс и объекты производных классов
- •7.6Виртуальные методы, свойства и индексаторы
- •7.7Абстрактные классы
- •8.Обработка исключений
- •8.1Основы обработки исключений
- •8.1.1Роль обработки исключений в .Net
- •8.1.2Составляющие процесса обработки исключений в .Net
- •8.2Перехват исключений
- •8.3Класс Exception
- •8.4Конфигурирование состояния исключения
- •8.4.1Свойство TargetSite
- •8.4.2Свойство StackTrace
- •8.4.3Свойство HelpLink
- •8.4.4Свойство Data
- •8.5Исключения уровня системы и приложения
- •8.5.1Исключения уровня системы (System.SystemException)
- •8.5.2Исключения уровня приложения (System.ApplicationException)
- •8.5.3Создание специальных исключений
- •8.6Обработка многочисленных исключений
- •8.6.1Применение нескольких операторов catch
- •1 2 0 10 12 Индекс выходит за пределы
- •8.6.2Перехват всех исключений
- •8.6.3Вложение блоков try
- •8.7Операторы throw и finally
- •8.7.1Оператор throw
- •8.7.2Повторное генерирование исключений
- •8.7.3Использование блока finally
- •8.8Исключения, связанные с поврежденным состоянием (Corrupted State Exceptions)
- •8.9Ключевые слова checked и unchecked
- •9.Интерфейсы, структуры и перечисления
- •9.1Интерфейсы
- •9.2Интерфейсные ссылки
- •9.2.1Ключевое слово as
- •9.2.2Ключевое слово is
- •9.3Интерфейсные свойства и индексаторы
- •9.3.1Интерфейсные свойства
- •9.3.2Интерфейсные индексаторы
- •9.4Наследование интерфейсов
- •9.5Явная реализация интерфейса
- •9.6Структуры
- •Назначение структур
- •9.7Перечисления
- •10.Делегаты, события и лямбда-выражения
- •10.1Делегаты
- •10.1.1Определение типа делегата в c#
- •10.1.2Базовые классы System.MulticastDelegate и System.Delegate
- •10.2Групповой вызов и адресация делегируемых методов
- •10.2.1Групповое преобразование делегируемых методов
- •10.2.2Применение методов экземпляра в качестве делегатов
- •10.2.3Групповая адресация
- •10.3Ковариантность и контравариантность делегатов
- •10.5Анонимные методы
- •10.6Лямбда-выражения
- •10.6.1Одиночные лямбда-выражения
- •10.6.2Блочные лямбда-выражения
- •10.7События
- •10.8Аксессоры событий
- •10.9Обработка событий в среде .Net Framework
- •Void обработчик(object отправитель, EventArgs е)
- •11.Обобщения
- •11.1Обзор обобщений
- •Рекомендации по именованию
- •11.2Обобщенные классы
- •11.3Ограниченные типы
- •Связь между параметрами типа с помощью ограничений
- •11.4Ограниченные классы
- •11.5Ограниченные интерфейсы и конструкторы Применение ограничения на интерфейс
- •Применение ограничения new() на конструктор
- •11.6Ограничения ссылочного типа и типа значения
- •11.7Иерархии обобщенных классов
- •11.8Средства обобщений Значения по умолчанию
- •Статические члены
- •11.9Обобщенные методы
- •11.10Обобщенные структуры
- •11.11Обобщенные делегаты
- •11.12Обобщенные интерфейсы
- •Сравнение экземпляров параметра типа
- •11.13Модификация обобщенных методов
- •11.13.1Переопределение виртуальных методов в обобщенном классе
- •11.13.2Перегрузка методов с несколькими параметрами типа
- •11.14Ковариантность и контравариантность в обобщениях
- •11.14.1Применение ковариантности в обобщенном интерфейсе
- •11.14.2Применение контравариантности в обобщенном интерфейсе
- •12.Коллекции, перечислители и итераторы
- •12.1Краткий обзор коллекций
- •12.2Необобщенные коллекции
- •12.2.1Интерфейсы необобщенных коллекций
- •12.2.2Структура DictionaryEntry
- •12.2.3Классы необобщенных коллекций
- •12.3Обобщенные коллекции
- •12.3.1Интерфейсы обобщенных коллекций
- •12.3.3Классы обобщенных коллекций
- •12.4Класс ArrayList
- •12.5Класс Hashtable
- •12.10.1Тип ключа
- •12.13Битовые коллекции
- •12.13.1Класс BitArray
- •12.13.2Структура BitVector32
- •12.14Специальные и наблюдаемые коллекции
- •12.14.1Специальные коллекции
- •12.14.2Наблюдаемые коллекции
- •12.15Параллельные коллекции
- •12.16Реализация интерфейса iComparable
- •12.17Реализация интерфейса iComparer
- •12.18Перечислители
- •12.18.1Применение обычного перечислителя
- •12.18.2Применение перечислителя типа iDictionaryEnumerator
- •12.19Реализация интерфейсов iEnumerable и iEnumerator
- •12.20Итераторы
- •13.Время жизни объектов
- •13.1Базовые сведения о времени жизни объектов
- •Установка объектных ссылок в null
- •13.2Роль корневых элементов приложения
- •Поколения объектов
- •13.3Параллельная и фоновая сборка мусора Параллельная сборка мусора в версиях .Net 1.0 - .Net 3.5
- •Фоновая сборка мусора в версии .Net 4.0
- •13.5Финализируемые объекты
- •Переопределение System.Object.Finalize()
- •Описание процесса финализации
- •13.6Высвобождаемые объекты
- •Повторное использование ключевого слова using в c#
- •13.7Финализируемые и высвобождаемые типы
- •Формализованный шаблон очистки
- •13.8Отложенная инициализация объектов
- •Полезные ссылки
11. Обобщения 296
11.1 Обзор обобщений 296
11.2 Обобщенные классы 298
11.3 Ограниченные типы 299
11.4 Ограниченные классы 301
11.5 Ограниченные интерфейсы и конструкторы 303
11.6 Ограничения ссылочного типа и типа значения 305
11.7 Иерархии обобщенных классов 306
11.8 Средства обобщений 307
11.9 Обобщенные методы 308
11.10 Обобщенные структуры 310
11.11 Обобщенные делегаты 311
11.12 Обобщенные интерфейсы 312
11.13 Модификация обобщенных методов 318
11.13.1 Переопределение виртуальных методов в обобщенном классе 318
11.13.2 Перегрузка методов с несколькими параметрами типа 318
11.14 Ковариантность и контравариантность в обобщениях 320
11.14.1 Применение ковариантности в обобщенном интерфейсе 320
11.14.2 Применение контравариантности в обобщенном интерфейсе 320
12. Коллекции, перечислители и итераторы 323
12.1 Краткий обзор коллекций 323
12.2 Необобщенные коллекции 326
12.2.1 Интерфейсы необобщенных коллекций 326
12.2.2 Структура DictionaryEntry 327
12.2.3 Классы необобщенных коллекций 327
12.3 Обобщенные коллекции 328
12.3.1 Интерфейсы обобщенных коллекций 328
12.3.2 Структура KeyValuePair<TKey, TValue> 328
12.3.3 Классы обобщенных коллекций 329
12.4 Класс ArrayList 330
12.5 Класс Hashtable 333
12.6 Стек: классы Stack и Stack<T> 335
12.7 Очередь: классы Queue и Queue<T> 337
12.8 Связный список: класс LinkedList<T> 338
12.9 Сортированный список: класс SortedList<TKey, TValue> 340
12.10 Словарь: класс Dictionary<TKey, TValue> 343
12.10.1 Тип ключа 343
12.10.2 Класс Dictionary<TKey, TValue> 344
12.11 Сортированный словарь: класс SortedDictionary<TKey, TValue> 346
12.12 Множества: классы HashSet<T> и SortedSet<T> 349
12.13 Битовые коллекции 351
12.13.1 Класс BitArray 351
12.13.2 Структура BitVector32 353
12.14 Специальные и наблюдаемые коллекции 354
12.14.1 Специальные коллекции 354
12.14.2 Наблюдаемые коллекции 355
12.15 Параллельные коллекции 357
12.16 Реализация интерфейса IComparable 359
12.17 Реализация интерфейса IComparer 361
12.18 Перечислители 364
12.18.1 Применение обычного перечислителя 364
12.18.2 Применение перечислителя типа IDictionaryEnumerator 365
12.19 Реализация интерфейсов IEnumerable и IEnumerator 366
12.20 Итераторы 367
13. Время жизни объектов 370
13.1 Базовые сведения о времени жизни объектов 370
13.2 Роль корневых элементов приложения 373
13.3 Параллельная и фоновая сборка мусора 376
13.4 Тип System.GC 376
13.5 Финализируемые объекты 380
13.6 Высвобождаемые объекты 382
13.7 Финализируемые и высвобождаемые типы 386
13.8 Отложенная инициализация объектов 388
Полезные ссылки 390
1.C# и платформа .Net
1.1Становление c#
Язык С# и связанную с ним среду .NET Framework можно без преувеличения назвать самой значительной из предлагаемых в настоящее время технологий для разработчиков. Среда .NET является такой средой, которая была создана для того, чтобы в ней можно было разрабатывать практически любое приложение для запуска в Windows, а С# является языком программирования, который был специально создан для использования в .NET Framework. Например, с применением С# и .NET Framework можно создавать динамические веб-страницы, приложения Windows Presentation Foundation, веб-службы XML, компоненты для распределенных приложений, компоненты для доступа к базам данных, классические настольные приложения Windows и даже клиентские приложения нового интеллектуального типа, обладающие возможностями для работы в оперативном и автономном режимах.
Не стоит поддаваться заблуждению из-за наличия в названии Framework слова "NET" и думать, что данная среда предназначена только для создания приложений, ориентированных на Интернет. Слово "NET" здесь является лишь показателем того, что, по мнению Microsoft, распределенные приложения, в которых обработка распределяется между клиентом и сервером, являются шагом вперед. Однако важно понимать, что С# представляет собой язык, предназначенный не только для написания приложений, способных работать в Интернете и в сети. Он предоставляет средства для кодирования практически любого типа программного обеспечения или компонентов для платформы Windows. Язык С# и среда .NET привели к революционным изменениям в способе написания разработчиками программ и сделали программирование приложений для Windows гораздо более простым, чем когда-либо.
С# — это относительно новый язык программирования, который характеризуется двумя следующими преимуществами:
С# спроектирован и разработан специально для применения с Microsoft .NET Framework (развитой платформой разработки, развертывания и выполнения распределенных приложений).
С# — язык, основанный на современной объектно-ориентированной методологии проектирования, при разработке которого специалисты из Microsoft опирались на опыт создания подобных языков, построенных в соответствии с предложенными около 20 лет назад объектно-ориентированными принципами.
Нужно подчеркнуть то важное обстоятельство, что С# — это полноценный язык программирования. Хотя он и предназначен для генерации кода, выполняемого в среде .NET, сам по себе он не является частью .NET. Существует ряд средств, которые поддерживаются .NET, но не поддерживаются С#, и, возможно, вас удивит, что есть также средства, поддерживаемые С# и не поддерживаемые .NET (например, некоторые случаи перегрузки операций). Однако поскольку язык С# предназначен для применения на платформе .NET, вам, как разработчику, важно иметь представление о .NET Framework, если вы хотите эффективно разрабатывать приложения на С#.
Для понимания важности .NET не помешает вспомнить о природе многих технологий Windows, которые появились в последние примерно 18 лет. Хотя на первый взгляд все они могут выглядеть довольно разными, на самом деле все операционные системы Windows, начиная с Windows 3.1 (которая вышла в 1992 г.) и заканчивая Window 7 и Windows Server 2008 R2, в основе своей имеют один и тот же хорошо знакомый API-интерфейс Windows. По мере появления новых версий Windows в этот API-интерфейс добавлялось много новых функций, но это был скорее процесс совершенствования и расширения API-интерфейса, а не его замена.
Давайте рассмотрим язык C# в его историческом контексте, упомянув и те движущие силы, которые способствовали его становлению.
