+++++++++Павловская++C#.ppt
- Количество слайдов: 78
Введение в объектноориентированное программирование. Основные элементы языка С#. Понятие класса. Лекция № 1
Основной учебник: Павловская Т. А. С#. Программирование на языке высокого уровня. Учебник для вузов. – СПб. : Питер, 2007. 2
1 Основы объектно-ориентированного программирования (ООП) Объектно-ориентированное программирование (ООП) — это методика разработки программ, в основе которой лежит понятие объект. Объект — это некоторая структура, соответствующая объекту реального мира, его поведению. Объект в программе – это совокупность данных, характеризующих его состояние, и функций их обработки, моделирующих его поведение. Для представления объектов используется понятие класс. 3
Класс — это специальный тип данных, включающий описание данных и описание процедур и функций (методов), которые могут быть выполнены над представителем класса — объектом. Объект – это конкретный экземпляр класса. Основные принципы ООП: • Наследование • Инкапсуляция • Полиморфизм 4
Наследование. Концепция объектно-ориентированного программирования предполагает возможность определять новые классы посредством добавления полей, свойств и методов к уже существующим классам. Такой механизм получения новых классов называется порождением. При этом новый, порожденный класс (потомок) наследует свойства и методы своего базового, родительского класса. 5
Инкапсуляция. Под инкапсуляцией понимается скрытие полей объекта с целью обеспечения доступа к ним только посредством методов класса. Объект используется через интерфейс – совокупность правил доступа. Полиморфизм — это возможность использовать одинаковые имена для методов, входящих в различные классы. 6
Язык С# является одним из компонентов платформы. NET Платформа. NET включает в себя • языки программирования VB. NET, J#. NET, C++. NET и др. • среду разработки приложений Visual Studio. NET для нескольких языков программирования • компиляторы, переводящие программу с соответствующего языка в промежуточный язык Microsoft Intermediate Language • общеязыковая среда выполнения Common Language Runtime (CLR) или виртуальная машина CLI • Библиотека классов 7
Все классы библиотеки. NET, а также создаваемые программистом в среде. NET классы имеют одного предка – класс object. Все классы сгруппированы в пространства имен. Любая создаваемая в. NET программа использует пространство имен System, в котором определены классы, обеспечивающие базовую функциональность. 8
2 Основные элементы языка C# Идентификатор – имя любого объекта (переменной, константы, процедуры и др. ). программы Идентификатор может включать буквы, цифры и символ подчеркивания. Идентификатор не может начинаться с цифры. Прописные и строчные буквы в идентификаторах различаются. Т. е. напр. , Vasja 1, VASJA 1 и Va. Sj. A 1 – это разные идентификаторы Длина идентификатора не ограничена. 9
Для использования ключевого слова в качестве идентификатора его нужно предварить символом @. Например, @if В С# для имен используют обычно две нотации: Паскаля и Camel. Нотация – соглашение о правилах создания имен. В нотации Паскаля каждое слово в имени начинается с прописной буквы: Max. Dlina В нотации Camel каждое слово в имени кроме первого начинается с прописной буквы: max. Dlina, my. Best. Friend 10
Типы данных Под типом данных понимается множество допустимых значений этих данных, а также совокупность операций над ними. По строению элемента По «создателю» По выделению По способу памяти хранения элементов Простые Встроенные Структурирован Определяемые ные программистом Статические Значимые Динамические Ссылочные 11
Встроенные типы С# однозначно соответствуют стандартным классам библиотеки. NET , определенным в пространстве имен System. Название Ключевое слово Тип. NET Логический bool Boolean Целые sbyte short ushort int uint long SByte Int 16 UInt 16 Int 32 UInt 32 Int 64 12
Название Ключевое слово Тип. NET Символьный char Char Вещественные float double Single Double Финансовый decimal Decimal Строковый string String object Object 13
Имя встроенного типа можно заменить соответствующего класса библиотеки. именем Т. е. у встроенных типов данных есть методы и поля, к которым можно обращаться. Например: int. Max. Value (System. Int 32. Max. Value) значение типа int. – максимальное 14
Константы (литералы) Константа Описание Примеры Логическая true или false Целая Десятичная: послед. цифр с суффиксом или без Шестнадцатеричная 8 5 u 0 2256 Lu С фикс. точкой С порядком Символ в апострофах Управляющая последовательность 3. 7 F 5 e-3. 11 E-6 D A * n a Вещественная Символьная 0 x. A 0 X 00 FFL 15
Строковая null Последовательность символов, заключенная в кавычки Значение по умолчанию для величин ссылочных типов Привет! tприветn. Как дела? @ D: programreadme. txt null 16
Переменные Все переменные, используемые в программе должны быть описаны явным способом. При описании задаются ее имя и тип: тип имя 1, [имя 2, имя 3, …]; Например, int dlina; float b; При описании можно инициализировать переменные: int x = 1, b; float y = 0. 1 f, n = y * 2 + 2. 1; 17
При описании инициализировать переменные не обязательно, но обязательно их инициализировать перед вычислениями. Область действия переменной начинается в точке ее описания и распространяется до конца блока, внутри которого она описана. Блок – это код, заключенный в фигурные скобки. Имя переменной должно быть уникальным в области ее действия. 18
Операции Ниже приводятся операции в порядке убывания приоритета. Первичные x++ x-new Постфиксный инкремент Постфиксный декремент Выделение памяти Унарные + ! ++x --x (тип)x Логическое отрицание Префиксный инкремент Префиксный декремент Преобразование типа * / % Умножение Деление Остаток от деления Мультипликативные 19
Аддитивные + - Сложение Вычитание Отношения < > <= >= меньше Больше Меньше или равно Больше или равно Проверки на равенство = = != Равно Не равно Условные логические && || Логическое ИЛИ Присваивания = *= /= += Присваивание Умножение с присваиванием Деление с присваиванием Сложение с присваиванием 20
Если операнды, входящие в выражение, одного типа и операция для этого типа определена, то результат выражения будет иметь тот же тип. Если операнды разного типа или операция для этого типа не определена, перед вычислениями автоматически выполняется преобразование типа по правилам неявного преобразования: 21
double float decimal long ulong int uint short ushort sbyte char 22
Преобразование выполняется непосредственно из исходного типа в результирующий. Если неявного преобразования из одного типа в другой не существует, можно задать явное преобразование с помощью операции (тип)x. За результатом должен следить программист. Например: long y = 500; int x = (int) y; byte z = (byte) x; В последнем случае данные будут потеряны. 23
3 Классы: основные понятия Класс — это специальный тип данных, включающий описание данных и описание функций (методов), которые могут быть выполнены над представителем класса — объектом. Данные и функции, описанные в классе, являются его элементами. Класс описывается следующим образом: [ атрибуты] [ спецификаторы] class имя_класса [ : предки] { тело класса } 24
Спецификаторы определяют свойства класса доступность для других элементов программы. public и доступ не ограничен protected для вложенных классов доступ только из элементов данного и производных классов internal доступ только из данной программы private для вложенных классов доступ только из элементов класса, внутри которого описан данный класс. Для не вложенных классов используются спецификаторы public и internal. По умолчанию принят спецификатор internal. только 25
Элементы класса : Ш Константы хранят неизменяемые значения, связанные с классом Ш Поля содержат данные класса Ш Методы реализуют действия, выполняемые классом или экземпляром ШСвойства определяют характеристики класса в совокупности со способами их задания и получения ( методами записи и чтения) Ш Конструкторы выполняют действия по инициализации экземпляров или класса в целом 26
ШДеструкторы определяют действия, выполняемые перед тем как объект будет уничтожен Ш Индексаторы обеспечивают возможность доступа к элементам класса по их порядковому номеру Ш Операции задают действия с объектами с помощью знаков операций Ш События, на которые может реагировать объект, определяют уведомления, которые может генерировать класс Ш Типы – внутренние по отношению к классу типы данных 27
Объекты класса создаются явным или неявным образом (программистом или системой). Для явного создания экземпляра используется операция new. Формат операции: new тип ( [ аргументы ]) Например, пусть имеется следующее описание класса: class Primer 1{} Тогда для создания объектов p 1 и p 2 в программе следует набрать Primer 1 p 1 = new Primer 1(); Primer 1 p 2 = new Primer 1(); 28
Программа на С# состоит из взаимодействующих между собой классов. При создании консольного приложения средой автоматически создается следующая заготовка: using System; using System. Collections. Generic; using System. Text; namespace Console. Application 1 { class Program { static void Main(string[] args) { } } } 29
Директива using System; разрешает использовать имена классов из пространства имен System без указания имени пространства. Ключевое слово namespace создает для проекта собственное пространство имен. Таким образом, программным объектам можно давать имена, не волнуясь о том, что они могут совпасть с именами в других пространствах имен. Пока программа содержит только один класс Program, содержащий только один элемент - метод Main. В каждом приложении обязательно должен присутствовать метод Main. Именно с него начинается выполнение программы. 30
Простейший ввод-вывод Для работы с консолью в С# применяется класс Console, определенный в пространстве имен System. В классе Console существует несколько вариантов методов с именами Write. Line, предназначенных для вывода значений различных типов. Методы с одинаковыми именами, но с разными параметрами называются перегруженными. Методы вывода перегружены для всех встроенных типов данных. Для доступа к методу используется операция доступа (точка): Console. Write. Line(параметр); 31
Например: Console. Write. Line("Здравствуйте, я ваша тетя!"); или Console. Write ("Здравствуйте, я ваша тетя!"); Если метод Write. Line (Write) вызван с одним параметром, он может быть любого встроенного типа. Если требуется вывести в одной строке несколько величин различного типа, передачей для вывода их нужно «склеить» в одну строку с помощью операции +. Перед объединением строки с числом нужно преобразовать число в строку с помощью метода To. String(). 32
Например: int x = 3; Console. Write. Line("x="+x. To. String()); В случае форматного вывода используется другой вариант метода с несколькими параметрами. Первым параметром передается строковая константа, содержащая обычные символы, которые выводятся на экран, а также управляющие последовательности и параметры в фигурных скобках. Эти параметры представляют собой номера переменных в списке вывода и при выводе заменяются на значения соответствующих переменных (Нумерация с нуля). 33
Например: int x = 3; float y=0. 6 f; Console. Write. Line("x={0}ty={1}", x, y ); Console. Write. Line("x="+x. To. String()+" y="+y. To. String()); Для каждого параметра можно задать ширину поля вывода. Например: Console. Write. Line("x={0, 5}ty={1, 4}", x, y ); 34
В классе Console для ввода строки можно использовать метод Read. Line(). Например, Console. Write("Как вас зовут? n"); string name = Console. Read. Line(); Для ввода символа можно использовать метод Read(), который возвращает код символа типа int или -1, если символ не был введен. Поэтому требуется явное преобразование в тип char. Console. Write("Введите символn"); char name = (char) Console. Read(); 35
Ввод чисел с клавиатуры можно осуществить в два этапа: -ввести число в виде строки символов - преобразовать строку в переменную соответствующего типа. Преобразование выполняется с помощью класса Convert из пространства имен System, используя соответствующие методы класса To. Int 32(s), To. Double(s), To. Byte(s) и т. д. Здесь s – параметр типа string. Например: string s; s = Console. Read. Line(); byte h = Convert. To. Byte(s); 36
Преобразование можно также выполнить с помощью метода Parse, который есть в каждом стандартном арифметическом классе. Например: byte w = byte. Parse(s); Функции класса Math В классе Math пространства имен System реализованы всевозможные математические функции. 37
Abs(x) Arccos x перегружен Acos(x) Arcsin x Asin(x) Arсtan x Atan(x) округление до большего целого Ceiling(x) Натуральный логарифм Log(x) Десятичный логарифм Log 10(x) число е число π Е PI 38
Округление Round(x) перегружен Exp(x) tg x Tan(x) Pow(x, y) Sqrt(x) Остаток от деления IEEERemainder(x, y) Округление до меньшего целого Знак числа Floor(x) Sign(x) тип результата int, аргументы перегружены 39
Пример. Вычислить значение выражения using System; using System. Collections. Generic; using System. Text; namespace Console. Application 1 40
{ class Program { static void Main(string[] args) { float x, z; string s; Console. Write. Line("Введите x"); s = Console. Read. Line(); x = Convert. To. Single(s); Console. Write. Line("Введите z"); s = Console. Read. Line(); z = Convert. To. Single(s); 41
double b = x * (Math. Atan(z) - Math. Exp(-(x + 3))); Console. Write. Line("x="+x. To. String() + " z=" + z. To. String()); Console. Write. Line("z=" + z. To. String()); Console. Read. Key(); } } } 42
Основные элементы классов: данные, методы, конструкторы. Лекция № 2 43
Данные: поля и константы Переменные, описанные в классе, называются полями класса. Синтаксис описания элемента данных: [ атрибуты ] [ спецификаторы ] [ const ] тип имя [ = начальное_значение]; Спецификаторы полей и констант: public доступ к элементу не ограничен protected доступ только из данного и производных классов internal доступ только из данной сборки private доступ только из данного класса static одно поле для всех экземпляров класса 44
readonly поле доступно только для чтения По умолчанию все элементы класса считаются закрытыми (private). Желательно определять переменные класса как закрытые, чтобы только методы того же класса имели доступ к их значениям. Поля, характеризующие класс в целом, т. е. имеющие одно и то же значение для всех экземпляров класса, следует описывать как статические. При создании каждого объекта (экземпляра) класса в памяти выделяется отдельная область, в которой хранятся его данные. Статические поля класса и константы существуют единственном экземпляре для всех объектов класса. 45 в
Обращение к статическому полю класса: имя класса. имя поля Обращение к константе класса: имя класса. имя константы Обращение к обычному полю ( полю экземпляра) класса: имя экземпляра. имя поля 46
Например, пусть в приложении описан класс Primer 1: class Primer 1 { public float x, y = 2. 5 f; //поля данных с неограниченным доступом public const int f = 1, z = 5; // константы public static char h = 'A', h 1; //статические поля данных double b; // закрытое поле данных } Обратиться к полям этого класса можно следующим образом: 47
class Program { static void Main(string[] args) { Primer 1 P 1 = new Primer 1(); Primer 1 P 2 = new Primer 1(); Console. Write. Line(P 1. x); Console. Write. Line(P 1. y); Console. Write. Line(P 2. x); Console. Write. Line(P 2. y); Console. Write. Line(Primer 1. f); Console. Write. Line(Primer 1. z); Console. Write. Line(Primer 1. h); Сonsole. Write. Line(Primer 1. h 1); } } 48
Оператор Console. Write. Line(P 1. b); будет ошибочным, т. к. обращаться к закрытому полю данных из другого класса нельзя. Доступ к такому полю можно получить только посредством метода. Результат выполнения программы: 0 2, 5 1 5 А пустая строка 49
Все поля автоматически инициализируются (статические – при инициализации классов, обычные – при создании объектов). Числовые получают значение 0, символьные и строковые – пустая строка. После этого полям присваиваются значения, указанные при явной инициализации (если таковая имеется). 50
Методы Метод –это оформленный особым образом поименованный фрагмент кода, который реализует вычисления или другие действия, выполняемые классом или объектом. Метод описывается один раз, а вызываться может необходимое количество раз. заголовок метода Синтаксис метода: [ атрибуты ] [ спецификаторы ] тип имя ([параметры]) { тело метода } последовательность операторов 51
Спецификаторы метода: public доступ не ограничен protected доступ только из данного и производных классов internal доступ только из данной сборки private доступ только из данного класса (по умолчанию) static одно поле для всех экземпляров класса Для работы со статическими данными класса используются статические методы (static), для работы с данными экземпляра – методы экземпляра (просто методы). Статические методы можно вызвать, не создавая объект. Чаще всего применяется спецификатор доступа к методам public. 52
Тип в заголовке метода определяет тип результата работы метода. Для передачи значения выражения в качестве результата работы метода используется оператор return выражение; Например: class Primer 2 { string s; public string vvods() { s = Console. Read. Line(); return s; } 53
Если метод не возвращает никакого значения, в заголовке указывается тип void, а оператор return отсутствует. Например: public void vyvods() { Console. Write. Line(s); } Параметры в заголовке используются для обмена информацией с методом и определяют множество значений аргументов, которые можно передавать в метод. Для каждого параметра указывается тип. 54
Например: static int maximum(int x, int y) { if (x > y) return x; else return y; } Обращение к статическому методу класса: имя класса. имя метода([аргументы]) 55
Обращение к нестатическому методу класса: имя объекта. имя метода([аргументы]) Если метод возвращает значение, то он вызывается отдельным оператором, а если не возвращает, то в составе выражения в правой части оператора присваивания. Например: Primer 2 S 1 = new Primer 2(); string g = S 1. vvods(); S 1. vyvods(); Console. Read. Key(); При вызове метода из другого метода того же класса имя класса или экземпляра можно не указывать. 56
При вызове метода с параметрами количество аргументов должно совпадать с количеством параметров в заголовке метода. Кроме того должно существовать неявное преобразование типа аргумента к типу соответствующего параметра. Например, если метод maximum является методом класса Primer 2, то из метода Main можно обратиться к нему след. образом: int max = Primer 2. maximum(5, 8); или int max = Primer 2. maximum(c 1, c 2+6); 57
Eсли метод maximum является методом класса Program, то из метода Main можно обратиться к нему след. образом: int max = maximum(5, 8); В С# предусмотрены след. виды параметров: • параметры-значения • параметры-ссылки • выходные параметры • параметры-массивы 58
При описании параметра-значения в заголовке метода указывается только тип. Параметр- значение представляет собой локальную переменную, которая получает в качестве своего значения копию значения аргумента. При вызове метода в качестве соответствующего аргумента на месте параметра-значения может находиться выражение, а в том числе переменная и константа. Например, описанный выше метод maximum имеет два параметра-значения. 59
Если в методе требуется изменить значение передаваемых в качестве параметров величин, используют параметры-ссылки. При описании параметра-ссылки в заголовке метода перед указанием типа помещают ключевое слово ref При вызове метода в область параметров копируется не значение аргумента, а его адрес, т. е. метод работает непосредственно с переменной из вызывающей функции и может ее изменить. При вызове метода в качестве аргумента на месте параметрассылки может находиться только ссылка на инициализированную переменную точно того же типа со словом ref перед аргументом. 60
Например: class Program { static void Udvoenie(ref int x, ref float y) { x = 2 * x; y *= 2; } static void Main(string[] args) { int a = 3; float b = 3. 5 f; Udvoenie(ref a, ref b); Console. Write. Line("a=" + a. To. String() + " b=" + b. To. String()); } } 61
Если нет необходимости инициализировать переменнуюаргумент до вызова метода, можно использовать выходные параметры. При описании выходного параметра в заголовке метода перед указанием типа помещают ключевое слово out. Выходному параметру обязательно должно быть присвоено значение внутри метода, а в вызывающем коде переменную достаточно описать. При вызове метода перед соответствующим аргументом тоже указывается слово out. 62
class Program { static void Vvod(out int x, out float y) { string s; Console. Write. Line("Введите целое число"); s = Console. Read. Line(); x = Convert. To. Int 32(s); Console. Write. Line("Введите вещественное число"); s = Console. Read. Line(); y = Convert. To. Single(s); } 63
static void Main(string[] args) { int a; float b; Vvod(out a, out b); Console. Write. Line("a=" + a. To. String() + " b=" + b. To. String()); Console. Read. Key(); } } 64
В любой нестатический метод автоматически передается скрытый параметр this, в котором хранится ссылка на вызвавший этот метод объект. Этот параметр применяется, например, когда требуется использовать имя поля, совпадающее с именем параметра метода: 65
class Primer 3 { int x; double y; public void set_x(int x) { this. x = x; } public void set_y(double y) { this. y = y; } public double sum() { return x + y; } } 66
class Program { static void Main(string[] args) { Primer 3 P 1 = new Primer 3(); Primer 3 P 2 = new Primer 3(); int a = 3; float b=4. 5 f; P 1. set_x(a); P 1. set_y(b); a = 5; b=5. 3 f; P 2. set_x(a); P 2. set_y(b); Console. Write. Line("сумма 1=" + P 1. sum(). To. String() ); Console. Write. Line("сумма 2=" + P 2. sum(). To. String()); Console. Read. Key(); } } 67
set_x x P 1 3 set_y y P 2 P 1. x P 1. y P 2. x 5. 3 P 2. y При выполнении оператора P 2. set_y(b); выполнение this. y = y; P 1. set_x(a); выполнение фактически y=b и P 2. y = y this. x = x; это фактически x=a и P 1. x = x 68
Конструкторы Конструктор экземпляра – это метод, предназначенный для инициализации объекта, автоматически вызываемый при создании объекта с помощью операции new. Имя конструктора должно совпадать с именем класса. [спецификатор] имя класса([параметры]) { тело конструктора} Обычно используется спецификатор public. Конструктор не возвращает значение. Класс может иметь несколько конструкторов инициализации объектов разными способами. для 69
Если конструктор в классе не определен, C# автоматически предоставляет конструктор по умолчанию, который инициализирует все поля нулями. Но если в классе определить хотя бы один конструктор, конструктор по умолчанию не используется. Для инициализации статических данных класса можно создать статический конструктор. Статический конструктор вызывается автоматически до вызова конструктора объекта. Он должен быть закрытым. static имя класса() { тело конструктора} 70
71
72
73
74
75
76
77
78
+++++++++Павловская++C#.ppt