1.Основные сведения о языке программирования C#. Он входит в новую версию Visual Studio - Visual Studio.NET. Кроме C# в Visual Studio.NET входят Visual Basic.NET и Visual C++. Перечислим особенности нового языка: - автоматическая уборка мусора - возможность манипулировать указателями и иметь непосредственный доступ к памяти - поддержка свойств и событий (аналогично VB) - поддержка атрибутов - встроенная поддержка основных типов (строка, массив, ...) - множественное наследование возможно только от интерфейсов (как в Java) - поддержка С API, Windows API и COM+ на уровне языка - поддержка assembly - контроль типов - автоматическая инициализация переменных Атрибуты являются новым механизмом. С их помощью можно ввести новые типы описательной информации для классов и методов и получать эту информацию во время выполнения. Единственное чего не хватает в новом языке – это шаблонов, так полюбившихся программистам на Си++ за последние несколько лет. Приведем код традиционной прграммы «Hello, world» using System; class Hello { static void Main() { Console.WriteLine("Hello, world"); } } 2. Описание архитектуры .NET. .NET платформа упрощает разработку приложений и повышает надежность кода. В частности, она обеспечивает автоматическое управление временем жизни объектов, нейтральные к языкам библиотеки классов и пересекающие границы языков наследование, обработку исключений и отладку. Архитектура .NET изображена на рисунке [Рисунок взят с сайта Microsoft.] Common Language Runtime опирается на системные сервисы операционной системы и управляет выполнением кода, написанного на любом современном языке программирования. Набор базовых классов дает доступ к сервисам платформы, которые разработчики могут использовать из любого языка программирования. Common Language Runtime и базовые классы вместе составляют основу .NET платформы. .NET предлагает также высокоуровневые сервисы: - ADO+ - новое поколение ADO, которое использует XML и SOAP для обмена данными - ASP+ - новая версия ASP, позволяющая использовать любой (.NET совместимый) язык для программирования Web страниц Win Forms и Web Forms – набор классов для построениения пользовательского интерфейса локальных и Web-ориентированны приложений. 3. Объекты и типы C#. Система типов поддерживает две категории типов, каждая из которых разделена на подкатегории: типы значений (типы-значения) и ссылочные типы (типы-ссылки). Схема типов представлена ниже. Система типов .NET Типы-значения Типы-ссылки Структуры Перечисления Классы Строки Массивы Простые типы Делегаты Интерфейсы Все типы, за исключением простых типов, могут определяться программистом. Все остальные типы (производные типы) требуют предварительного объявления. Простые типы – это типы, имя и основные свойства которых известны компилятору. Относительно встроенных типов компилятору не требуется никакой дополнительной информации. Он поддерживает эти типы самостоятельно. К простым типам относятся: целочисленные, вещественные, decimal, логический. Диапазоны значений простых типов: Имя типа в C# sbyte Соответствует FCL-типу System.SByte byte System.Byte Описание Целый. 8-разрядное значений: 128 … 127 Целый. 8-разрядное значений: 0 … 255 со без знаком. Диапазон знака. Диапазон short System.Int16 ushort System.UInt16 int System.Int32 uint System.UInt32 long System.Int64 ulong System.UInt64 char float double decimal System.Char System.Single System.Double System.Decimal bool System.Boolean Целый. 16-разрядное со знаком. Диапазон значений: -32768 … 32767 Целый. 16-разрядное без знака. Диапазон значений: 0 … 65535 Целый. 32-разрядное со знаком. Диапазон значений: -2147483648 … 2147483647 Целый. 32-разрядное без знака. Диапазон значений: -0 … 4294967295 Целый. 64-разрядное со знаком. Диапазон значений: -9223372036854775808 … 9223372036854775807 Целый. 64-разрядное без знака. Диапазон значений: 0 … 18446744073709551615 16 разрядный символ UNICODE. Плавающий. 32 разряда. Стандарт IEEE. Плавающий. 64 разряда. Стандарт IEEE. 128-разрядное значение повышенной точности с плавающей точкой. Значение true или false. При создании объекта элементарного типа производится его начальная инициализация предопределённым значением. За это отвечают предопределённые недоступные для модификации конструкторы. В C# различаются встроенные (элементарные primitive, предопределённые – predefined) и производные типы. Встроенные типы – это типы, имя и основные свойства которых известны компилятору. Производные типы требуют предварительного объявления. Ниже представлены основные отличия ссылочных типов и типов-значений. Объект содержит Располагается Значение по умолчанию При присваивании копируется Типы-значения значение в стеке 0, false, ‘\0’ значение Типы-ссылки ссылку в динамической памяти null ссылка 4. Наследование. Классом называется фрагмент кода, которому предшествует зарезервированное слово class. Членами класса могут быть данные (они называются полями) и подпрограммы (они называются методами). По своей сути класс – это тип, то есть образец для создания объектов (так называются переменные типа класса). В ООП существуют следующие понятия: инкапсуляции, наследовании и полиморфизме. Инкапсуляцией называется способность объектов «прятать» детали своей внутренней организации от пользователей. Например, в классе System.Console есть методы ReadLine() и WriteLine(), предназначенные, соответственно, для ввода и вывода строк. В следующем фрагменте показано использование этих методов: string S; Console.WriteLine("Введите ваше имя:"); Console.ReadLine(S); Другое преимущество инкапсуляции – возможность скрыть внутренние данные (поля) объекта. Как правило, при описании класса поля помечаются зарезервированным словом private. В результате доступ к ним становится возможен только с помощью открытых методов класса. Наследование – способность классов порождать себе подобные классы-наследники. Наследник получает от родительского класса все его сущности (поля, методы, свойства, делегаты) и может дополнять их своими, придающими наследнику дополнительную функциональность по сравнению с родительским классом. Такой подход способствует поэтапному созданию новых классов. Например, общий родительский класс Object определяет общие для всех классов методы, такие как Equals(), GetType(), ToString() и т. д. Если создаётся новый класс для управления, например, геометрическими фигурами, то полезно предварительно создать промежуточный класс GeomethricShape, унаследовав его от Object и определив в нем поля и методы, специфичные для всех геометрических фигур, например, поля X и Y, определяющие положение фигуры на экране, методы Show(), Hide(), Draw() и МоveTo(), предназначенные, соответственно, для показа фигур, их стирания, отрисовки и перемещения в новую точку. Полиморфизмом – способность родственных (то есть имеющих общий родительский класс) объектов решать схожие по смыслу проблемы разными способами. Для этого в каждом классе-потомке следует переопределить нужный родительский метод. Например, для классов Circle, Line или Rectangle, являющихся наследниками класса GeomethricShape, следует переопределить родительский метод Draw( ) , ответственный за отрисовку фигур, чтобы нарисовать, соответственно, окружность, линию или прямоугольник. 5. Работа с массивами. Массивы имеют один единственный базовый тип, т.е. все отдельные вхождения в массиве относятся к одному и тому же типу. Объявляются массивы следующим образом: <базовый_ТИП> [] <имя>; Массивы должны обязательно инициализироваться перед тем, как к ним можно будет получить доступ. Получать доступ к отдельным членам этого массива можно будет указанием их индекса в квад¬ратных скобках: <имя_массива>[<индекс>] Инициализировать массив можно двумя способами: указанием всего содержи¬мого массива в литеральной форме либо указанием размера массива и применением ключевого слова new для инициализации всех его элементов. Спецификация массива с использованием литеральных значений подразумевает предоставление заключенного в фигурные скобки списка разделенных запятыми зна¬чений для элементов: int [] myIntArray = {5, 9, 10, 2, 99}; Здесь задается массив myIntArray, состоящий из пяти элементов, каждому из кото-рых присваивается целочисленное значение. Второй подход требует применения следующего синтаксиса: int [] myIntArray = new int [5]; Ключевое слово new используется для явной инициализации массива, а кон¬стантное значение – для определения его размера. Такой подход приводит к при¬сваиванию все членам массива значения по умолчанию, каковым для числовых типов является 0. Для такой инициализации можно также применять и переменные с некон¬стантными значениями: int [] myIntArray = new int[arraySize]; При желании оба подхода можно комбинировать: int [] myIntArray = new int[5] {5, 9, 10, 2, 99}; Если размер определяется через переменную, то эта переменная должна быть обязательно константной: const int arraySize = 5; int [] myIntArray = new int[arraySize] {5, 9, 10, 2, 99}; Если опустить слово const, код компилироваться не будет. 6. Операции и приведения. 7. Делегаты и события. Делегаты Делегат (delegate) – это тип, который позволяет хранить ссылки на функции. Объявляются делегаты во многом так же, как функции, но только безо всякого тела функции и с ключевым словом delegate. В объ¬явлении любого делегата указывается возвращаемый тип и список параметров. После определения делегата можно объявлять переменную с типом этого делегата. Далее эту переменную можно инициализировать как ссылку на любую функцию, которая имеет точно такой же возвращаемый тип и список параметров, как и у делегата. После этого функцию можно вызывать с использованием переменной делегата так, будто бы это и есть сама функция. Наличие переменной, ссылающейся на функцию, также делает возможным вы-полнение и других операций, которые в противном случае были бы невозможными. Например, это позволяет передавать переменную делегата функции в качестве пара¬метра, после чего делегат может использоваться для вызова функции, на которую он ссылается, во время выполнения. В следующем практическом занятии демонстрирует¬ся применение делегата для получения доступа к одной из двух возможных функций. 8. Строки и регулярные выражения. Переменная типа string может воспри¬ниматься как доступный только для чтения массив переменных char. 9. Управление памятью и указатели.