Лекция 01-2 (Введение в С#).ppt
- Количество слайдов: 56
План лекции • • Новый язык программирования C# Структура программы Понятие класса Состав класса Поля Свойства Методы Переменные программы
1. Новый язык программирования С#
Общие сведения по языку C# • • Появился в 2001 году. Основан на языках Java и Visual Basic Общий прародитель C++ В первой версии языка: – 80 ключевых слов – 12 встроенных (базовых) типов данных • Включает все необходимое для создания объектно-ориентированных, компонентных программ. • Одобрен в качестве международного стандарта ECMA (ECMA-334) и ISO(ISO/IEC 23270)
Версии языка • Версия С# 1. 0 – 2001 г. (для Framework 1. 0) • Версия С# 2. 0 – 2005 г. (для Framework 2. 0) • Версия C# 3. 0 – 2007 г. (для Framework 3. 5) C# Java С++
Андерс Хейлсберг (Anders Hejlsberg) • Главный проектировщик и ведущий архитектор. • Датский учёный в области информатики. • В 1980 году он написал компилятор языка Паскаль, который продал фирме Borland (этот компилятор дожил до 7 версии (Borland Pascal). • До 1996 года главный проектировщик фирмы Borland, создал новое поколение компиляторов Паскаля: получился язык Delphi. • В 1996 году перешёл в Microsoft, где работал над языком J++ и библиотекой С++ - Windows Foundation Classes. • Позже возглавил комиссию по созданию и проектированию языка C#.
Программа на С# • Программа это набор взаимосвязанных классов. • Класс содержит данные и функции • В одном из классов должна быть функция Main, с этой функции начинается выполнение программы • Классы могут быть в разных файлах, в разных сборках (в библиотеках классов). • На внешние модули (библиотеки, или выполняемые модули) должны быть ссылки (references). • Для удобства ссылок на классы программы, желательно использовать пространство имен • Для удобства записи имен внешних классов можно использовать оператор using.
Структура программы (сборки) на языке С# Сборка Z. dll Сборка X. exe Class A Class Q Class C Class M Class V Class T ссылки Сборка Y. dll Class G Class K static void Main () …. Class F
Типы данных программы • Встроенные типы (int, float, …) • Пользовательские типы - классы (class)
Классы • Основные составные части программы на языке C# • Задают новые типы данных • Класс и тип – почти синонимы в С# • Везде, где могут использоваться встроенные типы, могут использоваться и классы – пользовательские типы.
Описание классов программы using XXX; // чужие пространства имен namespace MMM // наше пространство имен { class AAA // наш класс MMM. AAA { … } class BBB // другой наш класс MMM. BBB { … } }
Составные элементы класса 1. Поля (field) – обычно скрытые данные класса (внутренне состояние) 2. Свойства (property) – доступ к данным класса с помощью функций – – get – получить set – задать 3. Методы (methods) – операции над данными класса (поведение) (можно называть функциями) 4. События (event) – оповещение пользователей класса о том, что произошло что-то важное.
Доступ к элементам класса • public вызов или доступ откуда угодно • protected только из производных классов (соответствует модификатору “family” в CLI) • private доступ только внутри текущего класса
Функция Main • Выполнение программы начинается со статической функции с именем Main • Заголовок функции static void Main (string[ ] arg) {…} static void Main () {…} static int Main (string[ ] arg) {…} static int Main () {…} • В самом простом случае – выполняет некоторый алгоритм без использования объектов классов • Обычно создает экземпляры классов и вызывает их методы для решения задачи • может создать экземпляр того класса в котором находится сама и вызвать некоторый не статический метод решения задачи
Размещение описания методов класса и объектов Класс Point (); class Point { dist (); static int n=0; n = 0; private int _x; рrivate int _y; public Point () { _x=_y=0; 10258 x = 0; y = 0; } public double dist() { 10300 x = 0; y = 0; double d; d=_x*_x+_y*_y; d = Math. Sqrt(d); 10324 x = 0; y = 0; return d; } } static void Main () { Point p; p = new Point(); double ds = p. dist(); { Point p 1 = new Point(); Console. Write (p 1. dist()); } Point p 2 = new Point(); }
Классы и файлы • Классы записываются в файле с расширением *. cs, например, main. cs • В одном файле может быть описано несколько классов – в любом порядке • Один класс может описываться в нескольких файлах (начиная с C# 2. 0) – модификатор patial (перед словом class)
Простая программа на C# class Hello { static void Main( ) { // Use the system console object System. Console. Write. Line("Hello World"); } } • Запуск на выполнение – в режиме отладки F 5 – без отладки Ctrl – F 5 (остановка после выполнения)
Пример простого класса namespace Test. Prog // наше пространство имен { class Point // наш класс MMM. Point { public int x, y; // поля класса } class Program { static void Main( ) { Point a; a = new Point(); a. x = 4; a. y = 3; } } }
Пример простого класса со свойствами namespace Test. Prog // наше пространство имен { class New. Point // наш класс MMM. Point { private int _x, _y; // поля класса public int x { get { return _x; } set { _x = value; } } … } }
Использование описанного класса namespace Test. Prog // наше пространство имен { class Progr { static void Main( ) { New. Point a; a = new New. Point(); a. _x = 4; // error a. x = 4; // correct int a = a. x; } } }
Пример простого класса с методами class Point // наш класс MMM. Point { private int _x, _y; // поля класса public int X // свойства класса { get {…} set {…} } // методы - конструктор public Point () {x=0; y=0; } // вычисление длины public double dist () {return Math. Sqrt(_x*_x + _y*_y); } }
namespace Test. Prog // наше пространство имен { class Progr { static void Main( ) { Point a; a = new Point(3, 4); a. x = 4; // correct double r; r = a. dist(); } } }
Использование класса Объекты одного класса могут использоваться в других классах …
Переменные программы
Единая система типов . Net Framework • Традиционное представление о примитивных (встроенных типах) – В C++, Java они являются “магическими” – В Smalltalk, Lisp это полнофункциональные типы • C# объединяет эти подходы без потери производительности – Углубленная простота во все системе • Улучшенная расширяемость и повторная используемость – Новые примитивные типы, например, decimal – Коллекции, и т. п. , могут использоваться для всех типов
Переменные программы • Место для хранения данных • Имеют – названия (имена, идентификаторы). – Тип – Модификаторы [<модификаторы>] <тип> <имя> [= <значение>]; [<модификаторы>] = [<режим доступа>] [static] [const] public int x = 5; public static const int n=10;
Специальная переменная this • Ссылка на самого себя (на сам объект, в котором используется) • Нигде не объявляется
Типы переменных по области видимости • Уровня класса (статические переменные класса) – Доступ с помощью имени класса – Время жизни – время работы программы – Доступ из всех классов (если public) • Уровня объекта класса (поля) – Доступ с помощью ссылки на объект – Время жизни – от new до удаления ссылок – Доступ в методах класса (если public то из других классов) • Уровня метода (локальные переменные) – Доступ по имени – Время жизни – выполнения метода – Доступны только в методе после объявления
Типы в C# Ссылочные типы Массивы Классы Значащие типы Делегаты Интерфейсы Структуры Перечисления Простые типы Nullable types Строки
Создание переменных • Значащие типы – создаются в стеке – автоматически уничтожаются • Ссылочные типы – создаются в 2 шага • сперва объявляются – выделяется память в стеке для хранения адреса • затем выделяется память в куче с помощью оператора new
Различие между типами int v = 123; string s = “Hello World!”; Значение v s 123 Адрес 254 688 Hello World!
Наследование типов в CLR
Методы класса System. Object • Equals - виртуальный метод, возвращающий true если значения объектов совпадают (по умолчанию, если два объекта расположены в одном месте памяти). • Get. Hash. Code - виртуальный метод, возвращает некоторое целое число (хэш-код), однозначно идентифицирующее экземпляр класса. • Get. Type - возвращает объект типа Type, описывающий соответствующий тип. • To. String - виртуальный метод, возвращающий символьное представление значения переменной (по умолчанию возвращает строку, представляющую полное имя типа объекта).
Встроенные типы Type Size . Net Type Описание byte 1 Byte 0 -255 со знаком char 2 Char символы Unicode Bool 1 Boolean true или false. sbyte 1 SByte -128 --- +127 со знаком short 2 Int 16 Целые от -32, 768 до +32, 767 со знаком ushort 2 UInt 16 Целые от 0 до 65 535 без знака int 4 Int 32 от -2, 147, 483, 648 до +2, 147, 483, 647 uint 4 UInt 32 целые числа без знака от 0 до 4 294 967 295 float 4 Single от ± 1. 5 × 10 -45 до ± 3. 4 × 1038 ( 7 цифр) double 8 Double от ± 5. 0 × 10 -324 до ± 1. 7 × 10308 (16 цифр) decimal 16 Decimal ± 1. 0 × 10− 28 to ± 7. 9 × 1028 (28 значащих цифр) long 8 Int 64 от -9 223 372 036 854 775 808 до + 9 223 372 036 854 775 807 ulong 8 UInt 64 от 0 до 0 x. FFFFFFFF
Тип данных bool • Соответствует системному типу System. Boolean • Mожет хранить только значения констант true и false (булевые константы) • Можно назначать только булевые значения или константы, а также значений логического выражения: bool bc = (c > 64 && c < 123);
Преобразование типов • Неявное преобразование – К неявным относятся те преобразования, результат выполнения которых всегда успешен и не приводит к потере точности данных. – Неявные преобразования выполняются автоматически. – Если на диаграмме есть переход из типа A в тип B то, выполняется неявное преобразование типов • Явное преобразование – К явным относятся разрешенные преобразования, успех выполнения которых не гарантируется или может приводить к потере точности – Использование приведения типов (cast) • int i = (int) f; // с обрезанием дробной части – Использование стандартного класса Convert • int i = Convert. To. Int 32(f); // с округлением до ближайшего целого
Неявное приведение типов decimal ulong double uint float ushort byte char short sbyte
Применение диаграммы • Если на диаграмме задан путь (стрелками) от типа А к типу В, то это означает существование неявного преобразования из типа А в тип В. – Например из short в float • Все остальные преобразования между подтипами арифметического типа существуют, но являются явными. – Например из float в int
Неявное и явное преобразование // Error: no conversion from int to short int x=5, y=6; short z = x + y; int a = 5; float b = 1. 5 F; b = a; // нужно явное преобразование (кастинг) a = (int)b;
Преобразование типов с помощью класса Convert • Класс Convert содержит 15 статических методов вида To
Пример преобразования типов System. Single f = 0. 5 F; float b = f; int a; a = (int)f; // с обрезанием дробной части a = Convert. To. Int 32(f); // с округлением string s = "123"; // a = (int)s; a = Convert. To. Int 32(s);
Методы классов
Методы программы • Могут описываться только внутри классов • Имеют доступ – к закрытым и открытым переменным класса (полям) в котором описаны – могут содержать локальные переменные
Описание и вызов метода • Описание метода содержит <заголовок_метода> { тело_метода } • Синтаксис заголовка метода – [модификаторы] {тип_результата} имя_метода ([список_формальных_параметров]) • Вызов метода – имя_метода([список_фактических_параметров])
Описание метода
• Операторы и разделители языков Java и C#: –(){}[]; , . : ? ~ –=<>!+-*/%&|^ – == <= >= != += -= *= /= %= &= |= ^= – && || ++ -- << >> <<= >>= • Дополнительные операторы C#: – -> : : ? ?
Операторы языка С#
Операторы С# • Во многом совпадают с операторами Java • Выражения – Арифметические – Логические – Условия - if • Цикла – do, while, foreach • Переключатели – switch • Перехода - goto
• оператор goto aaa; c= a + b; aaa: a = 5; • операция ? : int a = 5, b = 7; n = (a < b) ? 1 : 5;
Выражение • Выражение это набор операндов - констант, переменных, функций, - объединенных знаками операций и скобками. • При вычислении выражения определяется его значение и тип • Порядок вычисления зависит от: – приоритета операций; – для операций одного приоритета порядок применения - слева направо или справа налево; – преобразования типов операндов и выбор реализации для перегруженных операций; – типа и значения результата выполнения операции над заданными значениями операндов определенного типа.
Понятие операции • Встроенное действие над операндами (переменными и константами) • В С# имеется множество операций (около 50) • В операциях могут участвовать размерные и ссылочные типы
• Операции выполняются над операндами одного типа • Если же операнды разных типов, то предварительно происходит неявное преобразование типа операнда. • Если оно не возможно, то ошибка • short -> int -> float -> double -> decimal
Приоритет Категория Операции Порядок 0 Первичные (expr) x. y f(x) a[x] x++ x-- new typeof(t) 1 Унарные + - ! ~ ++x --x (T)x 2 Мультипликативные * / % 3 Аддитивные + - 4 Сдвиг << >> 5 Отношения, проверка типов < > <= >= is as 6 Эквивалентность == != 7 Логическое & 8 Логическое исключающее ИЛИ (XOR) ^ 9 Логическое ИЛИ (OR) | 10 Условное И && 11 Условное ИЛИ || 12 Условное выражение ? : 13 Присваивание = *= /= %= += -= <<= >>= &= ^= |=
• Операторы и разделители языков Java и C#: –(){}[]; , . : ? ~ –=<>!+-*/%&|^ – == <= >= != += -= *= /= %= &= |= ^= – && || ++ -- << >> <<= >>= • Дополнительные операторы C#: – -> : : ? ?
Вызов метода My. Class a = new My. Class(); x = a. My. Method(val 1, val 2, … , val. N); d = (b + a. My. Method(5))/3. 14; float My. Method (double a) x = (5+2)/3. 14; a = func(x); { double w; x = a*25. 7/5. 6; return x; }
Операторы и операция языка C# • Присвоения (операция =) • Арифметические выражения (операции +, -, /, *) • Условный (if else) – Операции сравнения – Логические операции • Циклы (while, foreach) • Создание объектов классов (операция new) • Операция преобразования типа.
Формальные параметры методов • По умолчанию параметры передаются по значению. • Значением переменной ссылочного типа является ее адрес. • Можно задать передачу параметров по ссылке – ref – параметр должен иметь начальное значение – out – параметр может не иметь начального значения • Синтаксис объявления формального параметра [ref | out] <тип> имя