- •Введение в c# и платформу .Net Философия .Net
- •Введение в строительные блоки платформы .Net (clr, cts и cls)
- •Роль библиотек базовых классов
- •Понятие общей системы типов (cts)
- •Понятие общеязыковой спецификации (cls)
- •Понятие общеязыковой исполняющей среды (clr)
- •Различия между сборками, пространствами имен и типами
- •Лабораторная работа №1. Создание приложений на языке c# без использования ide Роль .Net Framework 4.5 sdk
- •Указание целевых входных и выходных параметров
- •Ссылка на внешние сборки
- •Построение приложений c# с использованием csc.Ехе
- •Компиляция нескольких файлов исходного кода
- •Лабораторная работа №2. Построение приложений .Net с помощью Visual Studio Создание нового проекта
- •Использование утилиты Solution Explorer
- •Ссылка на внешние сборки
- •Утилита Object Browser
- •Фрагменты кода и технология Surround With
- •Утилита Class Designer
- •Лабораторная работа №3. Основы программирования на c# Структура простой программы c#
- •Класс System.Console
- •Форматирование числовых данных
- •Системные типы данных и соответствующие ключевые слова c#
- •Объявление и инициализация переменных
- •Иерархия классов для типов данных
- •Члены числовых типов данных
- •Члены System.Boolean
- •Члены System.Char
- •Работа со строковыми данными
- •Базовые манипуляции строками
- •Управляющие последовательности
- •Итерационные конструкции c#
- •Лабораторная работа №4. Главные конструкции программирования на с# Методы и модификаторы параметров
- •Стандартное поведение передачи параметров по значению
- •Модификатор out
- •Модификатор ref
- •Модификатор params
- •Определение необязательных параметров
- •Вызов методов с использованием именованных параметров
- •Массивы в c# Объявление и инициализация массивов
- •Определение массива объектов
- •Базовый класс System.Array
- •Управление хранилищем, лежащим в основе перечисления
- •Объявление переменных типа перечисления
- •Динамическое извлечение пар “имя/значение” перечисления
- •Типы структур
- •Объектно- ориентированное программирование на c# Лабораторная работа №5. Работа с классами Знакомство с типом класса c#
- •Размещение объектов с помощью ключевого слова new
- •Определение специальных конструкторов
- •Роль ключевого слова this
- •Еще раз о необязательных аргументах
- •Понятие ключевого слова static
- •Определение статических полей данных
- •Определение статических классов
- •Основные принципы объектно-ориентированного программирования
- •Роль инкапсуляции
- •Роль наследования
- •Роль полиморфизма
- •Лабораторная работа №6. Инкапсуляция Модификаторы доступа c#
- •Стандартные модификаторы доступа
- •Первый принцип: службы инкапсуляции c#
- •Инкапсуляция с использованием традиционных методов доступа и изменения
- •Использование свойств внутри определения класса
- •Свойства, доступные только для чтения и только для записи
- •Взаимодействие с автоматическими свойствами
- •Понятие синтаксиса инициализации объектов
- •Работа с данными константных полей
- •Понятие полей, допускающих только чтение
- •Понятие частичных типов
- •Лабораторная работа №7. Наследование Базовый механизм наследования
- •Указание родительского класса для существующего класса
- •Ключевое слово sealed
- •Управление созданием базового класса с помощью ключевого слова base
- •Хранение секретов семейства: ключевое слово protected
- •Добавление запечатанного класса
- •Реализация модели включения/делегации
- •Определения вложенных типов
- •Лабораторная работа №8. Полиморфизм
- •Переопределение виртуальных членов в ide-среде Visual Studio
- •Запечатывание виртуальных членов
- •Абстрактные классы
- •Понятие полиморфного интерфейса
- •Сокрытие членов
- •Правила приведения к базовому и производному классу
- •Ключевое слово as
- •Ключевое слово is
- •Главный родительский класс System.Object
- •Переопределение System.Object.ToString()
- •Переопределение System.Object.Equals()
- •Статические члены System.Object
- •Лабораторная работа №9. Структурированная обработка исключений
- •Роль обработки исключений .Net
- •Строительные блоки обработки исключений в .Net
- •Базовый класс System.Exception
- •Простейший пример
- •Генерация общего исключения
- •Перехват исключений
- •Конфигурирование состояния исключения
- •Исключения уровня приложения (System.ApplicationException)
- •Построение специальных исключений, способ первый
- •Построение специальных исключений, способ второй
- •Обработка нескольких исключений
- •Общие операторы catch
- •Внутренние исключения
- •Какие исключения могут генерировать методы?
- •Результат наличия необработанных исключений
- •Лабораторная работа №10. Работа с интерфейсами Понятие интерфейсных типов
- •Реализация интерфейса
- •Вызов членов интерфейса на уровне объектов
- •Получение ссылок на интерфейсы: ключевое слово as
- •Получение ссылок на интерфейсы: ключевое слово is
- •Использование интерфейсов в качестве параметров
- •Использование интерфейсов в качестве возвращаемых значений
- •Массивы интерфейсных типов
- •Явная реализация интерфейсов
- •Проектирование иерархий интерфейсов
- •Множественное наследование посредством интерфейсных типов
Роль библиотек базовых классов
В дополнение
к среде CLR и спецификациям
CTS/CLS,
платформа .NET предоставляет
библиотеку базовых классов, которая
доступна всем языкам программирования
.NET. Эта библиотека не
только инкапсулирует разнообразные
примитивы, такие как потоки, файловый
ввод-вывод, системы визуализации
графики и механизмы взаимодействия
с различными внешними устройствами,
но также обеспечивает поддержку для
многочисленных служб, требуемых
большинством реальных приложений.
Рис. 1. Отношения между CLR, CTS, CLS и библиотеками базовых классов
Что привносит язык C#
Синтаксис языка программирования C# выглядит очень похожим на синтаксис языка Java. Однако называть C# клоном Java неправильно. В действительности и С#, и Java являются членами семейства языков программирования, основанного на С (куда также входят С, Objective С, C++), и потому они разделяют схожий синтаксис.
Вследствие того, что C# представляет собой гибрид из нескольких языков, он является таким же синтаксически чистым — если не чище — как и Java, почти столь же простым, как VB, и практически таким же мощным и гибким, как C++. Ниже приведен далеко не полный список ключевых особенностей языка С#.
Указатели использовать не требуется! В программах на C# обычно не возникает нужды в манипулировании указателями напрямую
Автоматическое управление памятью посредством сборки мусора. Учитывая это, ключевое слово delete в C# не поддерживается.
Формальные синтаксические конструкции для классов, интерфейсов, структур, перечислений и делегатов.
Аналогичная языку C++ возможность перегрузки операций для специальных типов без излишних сложностей
Возможность создания обобщенных типов и обобщенных членов. Используя обобщения, можно создавать очень эффективный и безопасный к типам код, который определяет множество заполнителей, указываемых во время взаимодействия с обобщенными элементами
Поддержка анонимных методов, которые позволяют предоставлять встраиваемую функцию везде, где требуется тип делегата.
Возможность расширения функциональности существующего типа (не создавая его подклассы) с использованием расширяющих методов.
Включение лямбда-операции (=>), которая еще больше упрощает работу с типами делегатов .NET.
Поддержка необязательных параметров, а также именованных аргументов в методах.
Возможно, наиболее важный аспект, который следует знать о языке С#, заключается в том, что он порождает код, который может выполняться только в рамках исполняя ющей среды .NET (использовать C# для построения COM-сервера или неуправляемого приложения C/C++ не допускается). Выражаясь официально, для обозначения кода, ориентированного на исполняющую среду .NET, применяется термин управляемый код. Двоичный модуль, который содержит управляемый код, называется сборкой (сборки более подробно рассматриваются далее в этой главе). В противоположность этому, код, который не может обслуживаться непосредственно исполняющей средой .NET, называется неуправляемым кодом.
Обзор сборок .NET
Какой бы язык .NET не был выбран для программирования, важно понимать, что хотя двоичные модули .NET имеют то же самое файловое расширение, как и неуправляемые двоичные компоненты Windows (*.dll или *.ехе), внутренне они устроены совершенно по-другому. В частности, двоичные модули .NET содержат не специфические, а независимые от платформы инструкции на промежуточном языке (Intermediate Language — IL) и метаданные типов.
Относительно аббревиатуры IL уместно сказать несколько дополнительных слов. IL также известен как промежуточный язык Microsoft (Microsoft Intermediate Language — MSIL) или же общий промежуточный язык (Common Intermediate Language — CIL).
Рис. 2. Все .NET-компиляторы генерируют инструкции CIL и метаданные
На этом этапе может возникнуть вопрос о том, какую выгоду приносит компиляция исходного кода в CIL, а не напрямую в набор ориентированных на конкретную платформу инструкций. Одним из самых важных преимуществ такого подхода является языковая интеграция. Как уже можно было увидеть, все компиляторы .NET генерируют примерно одинаковые CIL-инструкции. Благодаря этому все языки могут взаимодействовать в рамках четко обозначенной двоичной “арены”. Более того, поскольку CIL не зависит от платформы, сама .NET Framework является независимой от платформы, предоставляя те же самые преимущества, к которым привыкли разработчики на Java (например, единую кодовую базу, способную работать в средах разных операционных систем). В действительности существует международный стандарт для языка C# и крупного подмножества платформы .NET, а также реализации для многих операционных систем, отличных от Windows
Из-за того, что сборки содержат CIL-инструкции, а не инструкции, специфичные для платформы, CIL-код перед использованием должен компилироваться на лету. Компонент, который отвечает за компиляцию CIL-кода в понятные процессору инструкции, называется оперативным (just-in-time — JIT) компилятором (иногда его называют Jitter). Исполняющая среда .NET использует JIT-компилятор в соответствии с целевым процессором и оптимизирует его для базовой платформы.
