Про Си Шарп.ppt
- Количество слайдов: 80
1 Предварительные требования Изложение материала рассчитано на то что вы уже знаете: Основы программирования Переменные, директивы, функции, циклы, и т. п. Объектно-ориентированного программирования Классы, наследование, полиморфизм, члены классов, и т. п.
2 Цели создания C# • • Компоненто-ориентированность Все описывается объектами Надёжное и безотказное ПО Экономия капиталовложений
3 Цели создания C# Компоненто-ориентированность C# первый “Компоненто-ориентированный” язык в семействе C/C++ Что такое компонент? • Независимый модуль который может многократно использоваться и отдельно устанавливаться • Более грубая чем объект структура • (объекты это языко-зависимые конструкции) • Могут включать несколько классов • Часто не зависят от языка программирования • Как правило, разработчик и пользователь компонента не знают друга, работают в разных компаниях, и пользуются разными языками
4 Цели создания C# Компоненто-ориентированность • Концепция разделения на компоненты • Свойства, методы, события • Атрибуты времени разработки и времени исполнения • Интегрированная документация с использованием • XML • Принцип размещения кода в одном месте • Нет заголовочных файлов, файлов IDL, и т. п. • Можно встраивать в ASP страницы
5 Цели создания C# Всё описывается объектами Традиционный взгляд • C++: Простые типы реализуются сами по себе без привлечения объектов • Smalltalk, Lisp: Простые типы реализованы как объекты, но за счёт потери производительности C# использует единое представление типов без потери производительности • Это упрощает конструкцию системы • Улучшенная расширяемость • Новые простые типы: Decimal, SQL… • Коллекции, и т. п. , возможны для всех типов
6 Цели создания C# Корректное и надёжное программное обеспечение • Сборка мусора Отсутствуют утечки памяти и неверные указатели • Обработка исключений (Exceptions) • Безопасность использования типов Нет неинициализированных переменных, нет потенциально опасных преобразований типов • Избегаются распространенные ошибки Например if (x = y). . . • One-stop programming Меньше перемещающихся частей программы
7 • Описание класса в С# должно содержать встроенное (inline) описание всех методов — в этом языке заголовочных файлов не бывает. Благодаря этому правилу разработчики классов могут создавать высоко мобильный код, что является одной из ключевых концепций среды. NET. • Создавая С#-класс, вы имеете полностью инкапсулированную связку функциональных возможностей, которую можно легко перенести в любую среду разработки, и вам не надо беспокоиться, как в другом языке обрабатываются включаемые файлы и существует ли в нем вообще механизм включения файлов. • Такой подход — универсальное программирование ("one-stop programming"-) — позволяет, например, перебросить весь класс на страницу Active Server Pages (ASP), и он будет функционировать так, будто был скомпилирован для настольного приложения Windows!
8 Цели создания C# Сохраняет ваши вложения • Наследство C++ Пространства имён, указатели (в небезопасном (unsafe) коде), беззнаковые типы данных, и т. п. • Способность к взаимодействию C# взаимодействует с XML, SOAP, COM, DLLs, и любым языком. NET Framework
9 Типы Обзор • Программа C# это коллекция типов Классы, структуры, перечисляемые типы, интерфейсы, делегаты • C# имеет набор предопределённых типов Например int, byte, char, string, object, … • Вы можете создавать свои собственные типы • Все данные и код определяются внутри типов Нет глобальных переменных и глобальных функций
10 Типы Обзор Типы содержат: 1. Данные 1. 2. Поля, константы, массивы События 2. Функции 1. 2. Методы, операторы, конструкторы, деструкторы Свойства, индексаторы 3. Другие типы 1. Классы, структуры, перечисляемые типы, интерфейсы, делегаты
11 Типы Обзор • Можно создавать экземпляры типов… ▫ …и затем использовать их: вызывать методы, считывать и присваивать свойства, и т. п. • Можно преобразовывать один тип в другой ▫ Прямо и косвенно • Типы организуются в ▫ Пространства имён, файлы, сборки • Есть две категории типов: размерные (value) и ссылочные (reference) • Типы имеют иерархию
12 Типы Унифицированная система типов • Размерные типы ▫ Непосредственно содержат данные ▫ Не могут быть пустыми (null) • Ссылочные типы ▫ Содержат ссылки на объект ▫ Могут быть пустыми (null) • int i = 123; • string s = "Hello world“;
13 Типы Унифицированная система типов • Размерные типы ▫ Простые ▫ Перечисляемые ▫ Структуры int i; float x; enum State { Off, On } struct Point {int x, y; } • Ссылочные типы ▫ ▫ ▫ Корневые Строки Классы Интерфейсы Массивы Делегаты object string class Foo: Bar, IFoo {. . . } interface IFoo: IBar {. . . } string[] a = new string[10]; delegate void Empty();
14 Типы Унифицированная система типов Размерный тип (Структура) Ссылочный тип (Класс) Переменная Собственно значение Позиция в памяти Размещение На стеке в памяти В куче Инициализация Всегда имеет значение Может быть null По умолчанию 0 null Присваивание означает. Копирование данных Копирование ссылки
15 Типы Унифицированная система типов • Преимущества размерных типов ▫ Не размещаются в куче, меньше работы для Сборщика мусора ▫ Более эффективное использование памяти ▫ Короче путь указывающий на данные ▫ Унифицированная система типов Нет разделения на простые типы и объекты
16 Преобразования типов • Неявное преобразование ▫ Происходит автоматически ▫ Гарантированно выполняется успешно ▫ Не теряется информация (точность) • Явное преобразование ▫ Требует приведения типа ▫ Может не сработать ▫ Информация (точность) может быть потеряна • Оба явное и неявное преобразования должны быть заданы пользователем
17 Преобразования типов • • • int x = 123456; long y = x; // косвенное short z = (short)x; // прямое double d = 1. 2345678901234; float f = (float)d; // прямое long l = (long)d; // прямое
18 Типы Унифицированная система типов • Всё описывается объектами ▫ Все типы наследуются от объекта object ▫ Любые данные могут быть сохранены, переданы, и обработаны без дополнительной работы
19 Типы Унифицированная система типов • Полиморфизм Возможность выполнять операции над объектом без знания точного типа этого объекта void Poly(object o) { Console. Write. Line(o. To. String()); } Poly(42); Poly(“abcd”); Poly(12. 345678901234 m); Poly(new Point(23, 45));
20 Типы Унифицированная система типов • Вопрос: Как применяется полиморфизм к работе с размерными и ссылочными типами? Как переменная типа int (размерный тип) преобразуется в object (ссылочный тип)? • Ответ: Упаковка (boxing)! Упаковываются только размерные типы Ссылочные типы не упаковываются
21 Типы Унифицированная система типов Упаковка • Копирование переменной размерного типа в переменную ссылочного типа (object) • Каждому размерному типу соответствует “скрытый” ссылочный тип • Отметим, что из переменой размерного типа создаётся новая переменная ссылочного типа ▫ Нет простой передачи указателя на переменную • Размерный тип неявно преобразуется в объект, ссылочный тип ▫ Восходящее преобразование типов ( “up cast”)
22 Типы Унифицированная система типов Распаковка (unboxing) • Операция обратная упаковке • Копирует упакованное значение ▫ Копирует из ссылочного типа в размерный • Требует явного преобразования типов ▫ Может не сработать (как и все явные преобразования) ▫ Нисходящее преобразование типов (“down cast”)
23 Типы Унифицированная система типов Упаковка и распаковка • int i = 123; • object o = i; • int j = (int)o; //i->123 //o->System. Int 32 ->123 //j->123
24 Типы Унифицированная система типов Преимущества упаковки • Распространяет полиморфизм на все классы • Классы коллекций работают со всеми типами • Отпадает необходимость в классах оболочках • Заменяет тип Variant в OLE Automation Недостатки упаковки • Снижается производительность
25 Типы Предопределённые типы • Размерные ▫ ▫ ▫ Целые типы Вещественные типы Десятичный Логический Символ • Ссылочные ▫ Объект ▫ Строка
26 Предопределённые типы Типы значений • Всё это предопределённые структуры • Беззнаковые • Знаковые byte, ushort, uint, ulong sbyte, short, int, long • Логический • Символ • Вещественные bool char float, double, decimal
27 Предопределённые типы Целые типы Тип C# Системный тип Размер байт Знаковый? sbyte System. Sbyte 1 Да short System. Int 16 2 Да int System. Int 32 4 Да long System. Int 64 8 Да byte System. Byte 1 Нет ushort System. UInt 16 2 Нет uint System. UInt 32 4 Нет ulong System. UInt 64 8 Нет
28 Предопределённые типы Вещественные типы • Согласно спецификации IEEE 754 • Поддержка ± 0, ± Бесконечность, Na. N Тип C# Системный тип Размер байт float System. Single 4 double System. Double 8
29 Предопределённые типы decimal (десятичный) • 128 бит • 96 битовое значение масштабируемое степенью 10 • Более точное представление десятичных значений • Не поддерживает нули со знаками, бесконечности и Na. N Тип C# Системный тип Размер байт decimal System. Decimal 16
30 Предопределённые типы decimal (десятичный) • Целый тип может быть неявно преобразован в десятичный • Преобразование между десятичным и вещественными типами должно быть явно указано, так как возможна потеря точности • s * m * 10 e • s = 1 или – 1 • 0 ≤ m ≤ 296 • -28 ≤ e ≤ 0
31 Предопределённые типы Литеры для целых чисел Целые числа можно задавать в десятичной или шестнадцатеричной нотации • U или u: uint или ulong • L или l: long или ulong • UL или ul: ulong 123 0 x 7 B 123 U 123 ul 123 L // Десятичное // Шестнадцатеричное // Беззнаковое длинное целое // Длинное целое
32 Предопределённые типы Литеры для вещественных чисел • F или f: float • D или d: double • M или m: decimal • • • 123 f 123 D 123. 456 m 1. 23 e 2 f 12. 3 E 1 M // Float // Double // Decimal // Float // Decimal
33 Предопределённые типы bool(Логический) • Для представления логических значений true и false • Нельзя использовать 1 и 0 в качестве логических значений • Нет стандартного преобразования между bool и другими типами Тип C# Системный тип Размер байт bool System. Boolean 1
34 Предопределённые типы char (Символ) • Для представления символов Unicode • Литеры ▫ ‘A’ ▫ ‘u 0041’ ▫ ‘x 0041’ ▫ ‘n’ // Простой символ // Unicode // Шестнадцатеричное //беззнаковое короткое целое // Символ Escape //последовательности Тип C# Системный тип Размер байт char System. Char 2
35 Предопределённые типы char (Символ) • Некоторые символы Esc последовательности Символ Описание Значение n r t \ ” ’ Новая строка Возврат каретки Табуляция Ноль Обратная косая черта Двойная кавычка Одинарная кавычка 0 x 000 A 0 x 000 D 0 x 0009 0 x 0000 0 x 005 C 0 x 0022 0 x 0027
36 Предопределённые типы Типы ссылок • Строка символов • Корневой тип string object
37 Предопределённые типы object Корневой объект в иерархии • Дополнительно к данным резервируется ▫ 0 байт для типов значений ▫ 8 для типов ссылок • В действительности ссылка (не объект) занимает 4 байта Тип C# Системный тип Размер байт object System. Object 0/8
38 Предопределённые типы Внешние методы object • • public bool Equals(object) protected void Finalize() public int Get. Hash. Code() public System. Type Get. Type() protected object Memberwise. Clone() public void Object() public string To. String()
39 Предопределённые типы string (строка) • Непрерывная последовательность символов в формате Unicode • Ссылочный тип string s = “I am a string”; Тип C# Системный тип Размер байт String System. String Минимум 20
40 Предопределённые типы string (строка) • В обычных строках можно использовать esc последовательности. string s 1= “\\server\fileshare\filename. cs”; • В строках начинающихся с @: Большинство Esc последовательностей игнорируется Исключение для “” Допускается перенос на следующую строку • string s 2 = @”\serverfilesharefilename. cs”;
41 Типы определяемые пользователем • • • Перечисление Размерный тип Ссылочный тип Массив Интерфейс Указатель на функцию enum struct class int[], string[] interface delegate
42 Типы Перечисления • Перечисление задаёт имя типа для группы связанных по смыслу символических констант • Выбор значения из группы должен быть известен на этапе компилирования • Сильное типизирование ▫ Не допускаются неявные преобразования в/из целого типа ▫ Разрешено явное преобразование ▫ Операторы: +, -, ++, --, &, |, ^, ~, … • Можно указать внутренний тип ▫ byte, short, ushort, int, uint, long, ulong
43 Типы Перечисления enum Color: byte { Red = 1, Green = 2, Blue = 4, Black = 0, White = Red | Green | Blue } Color c = Color. Black; Console. Write. Line(c); Console. Write. Line(c. Format()); // 0 // Black
44 Типы Перечисления • Все перечисляемые типы происходят от • System. Enum • Он обеспечивает методы для ▫ ▫ Определения внутреннего типа Проверки возможно ли указанное значение Инициализации из строковой константы Извлечения всех значений типа
45 Типы Массивы • Массивы используются для сохранения группы элементов определённого типа в непрерывном блоке памяти • Массивы это ссылочные типы • Происходят от System. Array • Индекс с нуля • Могут быть многоразмерными ▫ Массивы знают свою длину и размерность • Проверка выхода за границы массива
• Объявление int[] primes; Типы Массивы • Размещение int[] primes = new int[9]; • Инициализация int[] prime = new int[] {1, 2, 3, 5, 7, 11, 13, 17, 19}; int[] prime = {1, 2, 3, 5, 7, 11, 13, 17, 19}; • Доступ к массиву и присвоение значений prime 2[i] = prime[i]; • Перебор элементов foreach (int i in prime) Console. Write. Line(i); 46
47 Типы Массивы • Многоразмерные массивы ▫ Прямоугольные int[, ] mat. R = new int[2, 3]; Можно инициализировать при объявлении int[, ] mat. R = new int[2, 3] { {1, 2, 3}, {4, 5, 6} }; ▫ Неопределённой формы Массив массивов int[][] mat. J = new int[2][]; Следует инициализировать программно
48 Типы Интерфейсы • Интерфейс определяет контакт ▫ Содержит методы, свойства, индексаторы, события ▫ Любой класс или структура реализующая интерфейс должна поддерживать все его составляющие • Интерфейсы обеспечивают полиморфизм ▫ Многие классы и структуры могут реализовывать один определённый интерфейс • Не содержат реализации ▫ Должны быть реализованы классом или структурой
49 Типы Классы • Определяемый пользователем ссылочный тип • Аналогичен классам C++ и Java • Наследование только от одного класса • Наследование нескольких интерфейсов
50 Типы Классы • Члены класса ▫ Константы, поля, методы, операторы, конструкторы, деструкторы ▫ Свойства, индексаторы, события ▫ Статические члены и члены экземпляра • Доступ к членам класса • private, protected, public, internal, protected internal По умолчанию private • Экземпляр класса создаётся оператором new
51 Типы Структуры • Похожи на классы, но ▫ Размерный тип, определяется пользователем ▫ Всегда наследуется от типа object • Идеален для небольших объектов ▫ Определяемые пользователем “простые” типы Комплексное число, точка, прямоугольник, цвет
52 Типы Структуры • • Могут наследовать несколько интерфейсов • Те же члены что и в классе • Доступ к членам структуры ▫ internal, public, private • Экземпляры создаются оператором new
53 Типы Делегаты • Делегат это ссылочный тип который определяет метод • Экземпляр делегата может содержать один или несколько методов ▫ Объектно-ориентированный указатель на функцию • Основа для обработки событий
54 Структура программы Обзор • • Организация типов Пространства имён Метод Main Синтаксис
55 Структура программы Организация типов • Физическая организация ▫ Типы определяются в файлах ▫ Файлы компилируются в модули ▫ Модули группируются в сборки СБОРКА МОДУЛЬ ФАЙЛ ТИП
56 Структура программы Организация типов • • • Типы определяются в файлах Файл может содержать несколько типов Каждый тип определяется в одном файле Файлы компилируются в модули Модуль это DLL или EXE Модуль может содержать несколько файлов Модули группируются в сборки Сборки могут содержать несколько модулей Часто соотношение модулей и сборок 1: 1
57 Структура программы Пространства имён • Пространства имён позволяют определять уникальные типы • Обеспечивают логическую организацию типов • Пространство имён может располагаться в нескольких сборках • Пространства имён могут быть вложенными • Пространства имён не зависят от файловой структуры (как в Java) • Полное имя типа включает все пространства имён в которые он входит
58 Структура программы Пространства имён namespace N 1 { class C 2 { }} // N 1. C 1 // N 1. C 2 namespace N 2 { class C 2 { }} } // N 1. N 2. C 2
59 Структура программы Пространства имён • Директива using позволяет использовать типы без указания полного имени • Всегда можно использовать полное имя using N 1; C 1 a; // N 1. неявно N 1. C 1 b; // полное имя C 2 c; // Ошибка! C 2 не определён N 1. N 2. C 2 d; // Один из классов C 2 C 1. C 2 e; // Другой
60 Структура программы Пространства имён • Директива using также позволяет создавать Псевдонимы using C 1 = N 1. N 2. C 1; using N 2 = N 1. N 2; C 1 a; // Ссылка на N 1. N 2. C 1 b; // Ссылка на N 1. N 2. C 1
61 Структура программы Метод Main • Выполнение начинается со статического метода Main() • Может быть только один метод с одним из нижеуказанных интерфейсов • • static void Main() static int Main() static void Main(string[] args) static int Main(string[] args)
62 Структура программы Синтаксис • Идентификаторы ▫ ▫ ▫ ▫ Имена типов, методов, полей, и т. п. Должно быть целое слово – без пробелов Содержит символы Unicode Начинается с буквы или подчёркивания Чувствителен к регистру Не должен совпадать с ключевым словом Кроме имеющих префикс @
63 Переменные и константы ‘видимы’ от места Объявления до конца блока В пределах ‘видимости’ переменной или константы объявление другой переменной или константы с тем же именем является ошибкой { int x; // Error: can’t hide variable x }}
64 Переменные • Перед использованием переменной ей следует присвоить значение • Автоматическое присвоение значений используется для статических полей, полей экземпляров классов и элементов массивов void Foo() { string s; Console. Write. Line(s); } // Ошибка
65 Оператор goto и метки goto может использоваться для передачи управления внутри или за пределы блока, но не во включённый блок Пример использования:
66 static void Find(int value, int[, ] values, out int row, out int col) { int i, j; for (i = 0; i < values. Get. Length(0); i++) for (j = 0; j < values. Get. Length(1); j++) if (values[i, j] == value) goto found; throw new Invalid. Operation. Exception(“Не найдено"); found: row = i; col = j; }
67 Оператор switch • Может делать ветвление по любому предопределенному типу (включая string) и enum ▫ Пользовательские типы должны поддерживать неявное преобразование к этим типам • Необходимо явно указать как закончить выбор ▫ директивой break, goto case, goto label, return, throw или continue ▫ Это устраняет ошибку перехода к следующему выбору
68 int Test(string label) { int result; switch(label) { case null: goto case “runner-up”; case “fastest”: case “winner”: result = 1; break; case “runner-up”: result = 2; break; default: result = 0; } return result; }
69 Оператор foreach • Итерация массивов public static void Main(string[] args) { foreach (string s in args) Console. Write. Line(s); }
70 Оператор foreach • Итерация пользовательских коллекций • Создаётся реализацией интерфейса Ienumerable foreach (Customer c in customers. Order. By("name")) { if (c. Orders. Count != 0) {. . . } }
71 Обработка исключений • Исключения это механизм C# для обработки неожиданно возникающих ошибок • Лучше чем возвращаемые значения статуса операции ▫ Их нельзя игнорировать ▫ Не нужно обрабатывать их в той точке где они возникли ▫ Могут использоваться даже если нет возвращаемого значения (например доступ к свойству) ▫ Имеется стандартная обработка исключений
72 Обработка исключений try. . . catch. . . finally • Блок try содержит код который может привести к исключению • Блок catch обрабатывает исключение ▫ Может быть несколько блоков catch для обработки разных типов исключений • Блок finally содержит код который исполняется всегда ▫ Для выхода из блока finally нельзя использовать директивы перехода (такие как goto)
73 Обработка исключений • Директива throw вызывает исключение • Исключение представлено экземпляром класса System. Exception или его наследника ▫ Содержит информацию о исключении ▫ Свойства Message Stack. Trace Inner. Exception • Вы можете повторно вызвать исключение, или перехватить одно исключение и вызвать другое
74 Обработка исключений try { Console. Write. Line("try"); throw new Exception(“message”); } catch (Argument. Null. Exception e) { Console. Write. Line(“caught null argument"); } catch { Console. Write. Line("catch"); } finally { Console. Write. Line("finally"); }
75 Синхронизация • Многопоточные приложения нуждаются в синхронизации для обеспечения доступа к общим данным • Необходимо предотвратить повреждение данных • Директива lock использует экземпляр класса для обеспечения взаимоисключения • Только одна директива lock может получить доступ к одному экземпляру
76 Синхронизация public class Checking. Account { decimal balance; public void Deposit(decimal amount) { lock (this) { balance += amount; }} public void Withdraw(decimal amount) { lock (this) { balance -= amount; }} }
77 Директива using • C# применяет автоматическое управление памятью (сборка мусора) ▫ Устраняется большинство проблем управления памятью • Однако, это приводит к неопределённости при завершении работы ▫ Не гарантируется вызываются ли и если вызываются то когда деструкторы объектов
78 Директива using • Объекты, которые должны быть деинициализированы после использования должны реализовывать интерфейс System. IDisposable ▫ Один метод: Dispose() • Директива using позволяет вам создать экземпляр класса, использовать его, и затем быть уверенным в том что метод Dispose вызван при окончании работы • Dispose гарантированно вызывается
79 public class My. Resource : IDisposable { public void My. Resource() { // захватываем ресурс} public void Dispose() { // освобождаем ресурс} public void Do. Something() { …} } using (My. Resource r = new My. Resource()) { r. Do. Something(); } //вызывается r. Dispose()
80 Дополнительные ресурсы • • • http: //msdn. microsoft. com http: //windows. oreilly. com/news/hejlsberg_0800. html http: //www. csharphelp. com/ http: //www. csharp-station. com/ http: //www. csharpindex. com/ http: //msdn. microsoft. com/msdnmag/issues/0900/csharp/cs harp. asp • http: //www. hitmill. com/programming/dot. NET/csharp. html • http: //www. c-sharpcorner. com/ • http: //msdn. microsoft. com/library/default. asp? URL=/libr ary/dotnet/csspec/vclrfcsharpspec_Start. htm
Про Си Шарп.ppt